[英]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.