簡體   English   中英

如何在 C# 中將字符串變量轉換為雙精度

[英]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 ,我們可以使用它來進一步驗證結果並強制用戶輸入一個有效的號碼。

例如,如果我們想讓他們從110中選擇一個數字怎么辦? 我們不想為進一步的驗證再次設置循環,所以讓我們將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM