为什么在有效的双输入上接收FormatException?

时间:2011-12-01 21:07:45

标签: c#

我收到FormatException,我不知道为什么。

System.FormatException was unhandled by user code
  Message=Input string was not in a correct format.
  Source=mscorlib
  StackTrace:
       at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
       at System.Convert.ToDouble(String value)

代码行:

DELTA_BUY = Convert.ToDouble(parameters["DELTA_BUY"]);

值(来自调试窗口):

parameters["DELTA_BUY"] "0.0016"    string

upd 在一个执行路径上正常工作,但在另一个执行传递(来自WCF)时失败。双重可重复,与字符串一起使用。可能是格式/国有化问题?

3 个答案:

答案 0 :(得分:5)

您的机器是否设置为“0.0016”不是有效数字的文化? 尝试

DELTA_BUY = Convert.ToDouble(parameters["DELTA_BUY"], System.Globalization.CultureInfo.InvariantCulture);

答案 1 :(得分:1)

可能你正在运行区域设置问题,线程语言或相关的东西。如果您始终使用.作为小数分隔符来接收数据,则可以使用以下内容:

Convert.ToDouble("0.0016", new NumberFormatInfo{ NumberDecimalSeparator = "."});

答案 2 :(得分:0)

字符串本身是否包含双引号?解析器无法转换嵌入了引号的字符串。除此之外,我认为没有理由为什么包含该值的字符串在en-US文化或不变文化中不能被解析为双重字符串。

在其他文化中,小数点不能用于标记数字中的“零功率”位置。例如,法国(fr-FR)通常使用逗号,千位分隔符是空格。在具有这些差异的任何文化中,尝试解析此字符串都将失败。您可以通过在执行转换时指定特定区域性来避免这种情况,您知道它将处理正在使用的数字格式:

//this will definitely work, as the en-US culture would definitely be able 
//to parse this number string.
DELTA_BUY = Convert.ToDouble(parameters["DELTA_BUY"], new CultureInfo("en-US"));
//this SHOULD work, and is generally more proper than forcing use of the US
//culture's formatter in a program otherwise designed to work in, say, Italy.
DELTA_BUY = Convert.ToDouble(parameters["DELTA_BUY"], CultureInfo.InvariantCulture);

Invariant文化描述了一种通用的英语文化(它将使用小数中的小数点),并且应该强制系统忽略任何可能不使用小数点来分隔整数和小数部分的特定文化。号。