代码在针对.NET3.5的VS2008中编译。这在我的系统上是不可重现的。我怀疑某种本地化设置正在发挥作用,但我对此并不了解。
所有其他有效数字似乎都运行良好。该代码说明了该错误(导致相同的异常,但不是生产代码):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string str = "";
do
{
str = Console.ReadLine();
Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
}
while (str != null);
}
}
}
在命令行中,输入“0”会使我遇到的至少一个系统上的应用程序崩溃。
来自用户PC的堆栈跟踪:
System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Double.Parse(String s, NumberStyles style, NumberFormatInfo info)
at System.Convert.ToDouble(String value)
答案 0 :(得分:5)
我从一段时间的问题中记住了这个问题。 Parse()方法受控制面板+区域和语言小程序中的用户覆盖的影响。 IIRC,它对“负号符号”设置特别敏感。请您的用户更正那里的设置。
参考问题is here。
答案 1 :(得分:4)
如果您的问题与当前文化有关,请尝试使用不变文化转换为Double:
Convert.ToDouble("0", System.Globalization.CultureInfo.InvariantCulture);
答案 2 :(得分:1)
很容易证明这不是因为代码(或CultureInfo),我可以证明,对于.NET中的所有文化,字符串“0”可以正确转换为双倍。
string inputNumber = "0";
foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
try
{
double d = Convert.ToDouble(inputNumber, culture);
}
catch
{
Console.WriteLine(culture.Name);
}
}
Console.WriteLine("end");
Console.Read();
它只输出“结束”。
答案 3 :(得分:0)
它可能与文化背景有关。据我所知,在某些文化设置中,您应键入0.0以便能够转换为双
答案 4 :(得分:0)
输入0
时,我认为它不会崩溃。
当你输入任何不是数字的东西时,它会崩溃。这意味着如果输入空字符串(换句话说,只需按Enter键)它就会崩溃。我想这就是你所经历的。
如果您将代码更改为此代码,则代码将起作用(仅适用于数字):
string str = "";
do
{
str = Console.ReadLine();
if(!string.IsNullOrEmpty(str))
Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
}
while (str != "");
答案 5 :(得分:0)
CurrentCulture CultureInfo实例可能是罪魁祸首。毕竟,Convert.ToDouble调用只会返回Double.Parse的结果。据记载,这使用当前文化的NumberFormatInfo来解决问题。