[英]How could I convert a string variable to a double in C#
我正在嘗試將字符串變量轉換為雙精度。
到目前為止,我已經嘗試過 Convert.ToDouble()
string userAge;
Console.WriteLine("What is your age?");
Console.ReadLine();
Convert.ToDouble(userAge);
當我嘗試對userAge
進行操作時,它顯示此錯誤:
Program.cs(23,27): error CS0019: Operator '/' cannot be applied to operands of type 'string' and 'double' [/home/ccuser/workspace/csharp-working-with-numbers-arithmetic-operators-csharp/e3-workspace.csproj]
Program.cs(29,28): error CS0029: Cannot implicitly convert type 'string' to 'double' [/home/ccuser/workspace/csharp-working-with-numbers-arithmetic-operators-csharp/e3-workspace.csproj]
Program.cs(17,24): error CS0165: Use of unassigned local variable 'userAge' [/home/ccuser/workspace/csharp-working-with-numbers-arithmetic-operators-csharp/e3-workspace.csproj]
The build failed. Fix the build errors and run again.
有什么建議么?
首先,您需要將這些方法調用的結果(獲取用戶輸入,然后將字符串轉換為雙精度數)分配給一些變量,以便稍后在代碼中使用它們:
Console.WriteLine("What is your age?");
string input = Console.ReadLine();
double age = Convert.ToDouble(input);
但是現在我們看到有一個問題——如果用戶輸入一個非數字輸入,我們會得到一個FormatException
。
幸運的是,我們可以使用一種更好的方法將字符串解析為雙精度: double.TryParse
。 此方法接受一個string
(輸入)和一個out
參數,它將在成功時設置為轉換后的值(或在失敗時設置為默認值0
)。 最好的是它返回一個bool
,指示它是否成功,所以我們可以將它用作循環的條件:
Console.Write("What is your age? ");
string userAge = Console.ReadLine();
double age;
while (!double.TryParse(userAge, out age))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Invalid input, please try again.");
Console.ResetColor();
Console.Write("What is your age? ");
userAge = Console.ReadLine();
}
// Now 'age' is the converted value entered by the user
現在我們有一個解決方案,它將循環直到用戶輸入一個有效數字。 但這是相當多的代碼。 如果我們必須從他們那里得到另一個號碼怎么辦? 可能最好將其提取到一個接受string
(用作提示)並返回強類型double
結果的方法中:
public static double GetDoubleFromUser(string prompt)
{
bool isValid = true;
double result;
do
{
if (!isValid)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Invalid input, please try again.");
Console.ResetColor();
}
else isValid = false;
Console.Write(prompt);
} while (!double.TryParse(Console.ReadLine(), out result));
return result;
}
現在我們的主要代碼要簡單得多:
double userAge = GetDoubleFromUser("What is your age? ");
double userWeight = GetDoubleFromUser("What is your weight? ");
現在,如果我們想要更高級一點,我們可以包含一個可選的“validator”參數,它是一個 function,它接受一個double
並返回一個bool
,我們可以使用它來進一步驗證結果並強制用戶輸入一個有效的號碼。
例如,如果我們想讓他們從1
到10
中選擇一個數字怎么辦? 我們不想為進一步的驗證再次設置循環,所以讓我們將Func<double, bool>
傳遞給該方法,以便它可以為我們進行驗證!
例如:
public static double GetDoubleFromUser(string prompt, Func<double, bool> validator = null)
{
bool isValid = true;
double result;
do
{
if (!isValid)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Invalid input, please try again.");
Console.ResetColor();
}
else isValid = false;
Console.Write(prompt);
} while (!double.TryParse(Console.ReadLine(), out result) &&
(validator == null || !validator.Invoke(result)));
return result;
}
現在我們可以傳入我們想要對方法的輸入進行的任何驗證,這看起來像下面的代碼行,並且在用戶輸入大於或等於1
的有效數字之前,該方法不會返回並且小於或等於10
:
double number = GetDoubleFromUser("Choose a number from 1 to 10: ",
x => x >= 1 && x <= 10);
您沒有將Convert
調用的結果分配給變量,而只是將其丟棄。 Convert 不會改變現有變量的類型(因為除了其他考慮之外,您根本無法在強類型語言中這樣做),而是生成一個新變量供您在數學中使用。
錯誤是,我認為沒有看到相關代碼,因為您嘗試在計算中使用userAge
,正如我剛剛解釋的那樣,它仍然是一個字符串。
此外,對於 go 后退一步,您從來沒有真正將 ReadLine 操作的結果分配給 userAge 變量。
這個:
Console.WriteLine("What is your age?");
string userAge = Console.ReadLine();
double age = Convert.ToDouble(userAge);
會更有意義。 然后在你的計算中使用age
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.