2011-12-01 10 views
0

我收到FormatException,我不知道为什么。为什么在有效的双输入时收到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

@RubensFarias可能是这样的。但有趣的是,在一个执行路径上它工作正常。在另一个执行路径上失败(更新说明)。我不知道在哪里检查/调整区域设置 – javapowered

+0

这两个路径中的字符串是否相同? – DaveShaw

回答

3

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

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

这样工作。 .. – javapowered

+0

嗯......出于好奇,文化是你的机器?英国文化阅读正确,欧洲大陆文化将读取它作为16(而不是扔)... – Josh

+0

我猜可能是英语或俄罗斯文化,因为我有这两种语言安装在系统上。 – javapowered

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); 

不变区域性描述了一个通用的英语为母语的文化(这将在分数使用小数点数字),并应强制系统忽略任何可能不使用小数点的特定文化来区分数字的整体和小数部分。

+0

不,字符串本身不包含双引号,我认为它是调试窗口表示 – javapowered

1

也许你在区域设置的问题,由于相关的线程语言什么的运行。如果您始终以.作为小数点分隔符接收您的数据,则可以使用下面的代码:

Convert.ToDouble("0.0016", new NumberFormatInfo{ NumberDecimalSeparator = "."}); 
相关问题