如何从控制台读取示例0.3的double值?当我在0.3之前输入类似于.X之类的内容时会抛出异常。
到目前为止,我已尝试过类似的内容:
Console.WriteLine("Type x: ");
double x = Convert.ToDouble(Console.ReadLine());
答案 0 :(得分:4)
Convert.ToDouble
(string)方法会将Double.Parse
与CurrentCulture
设置一起使用。这是怎样的implemented;
public static double ToDouble(String value)
{
if (value == null)
return 0;
return Double.Parse(value, CultureInfo.CurrentCulture);
}
这个Double.Parse实现为;
public static double Parse(String s, IFormatProvider provider)
{
return Parse(s, NumberStyles.Float| NumberStyles.AllowThousands, NumberFormatInfo.GetInstance(provider));
}
如您所见,如果NumberStyles.Float| NumberStyles.AllowThousands
与您的CurrentCulture
设置匹配,此解析操作将仅 。
我强烈怀疑您的CurrentCulture
NumberFormatInfo.NumberDecimalSeparator
property不是点(.
)这就是您的代码抛出FormatException
的原因。
你可以选择2个;使用NumberDecimalSeparator
.
作为InvariantCulture
CurrentCulture
或.Clone
NumberDecimalSeparator
.
并将Console.WriteLine("Type x: ");
double x = DateTime.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = ".";
Console.WriteLine("Type x: ");
double x = DateTime.Parse(Console.ReadLine(), culture);
设为{{1}}的文化1}}。
{{1}}
或
{{1}}
答案 1 :(得分:1)
请改为尝试:
double x = double.Parse(Console.ReadLine(), NumberStyles.Any, CultureInfo.InvariantCulture);
答案 2 :(得分:0)
我会使用TryParse:
Console.Write("Type x: ");
var input = Console.ReadLine();
double value;
while (!double.TryParse(input, NumberStyles.Any,
CultureInfo.InvariantCulture, out value))
{
Console.Write("{0} is not a double. Please try again: ");
input = Console.ReadLine();
}
Console.WriteLine("Thank you! {0} is a double", value);