Convert.ToDouble(“4089.90”)输出40.899,00为什么?

大家好我正在开发一个使用数字精度的软件,但是我遇到了这个问题,当我拿一个字符串转换为double时,它会输出我不同的文化。

比如我用

Convert.ToDouble("4089.90"); // it outputs 40.899,00 

奇怪的是,在我的电脑中它工作正常,但在客户端的PC上(在区域设置中具有相同的文化)向我显示后者的输出。 我知道我可以用它修复它

 Convert.ToDouble("4089.90", System.Globalization.CultureInfo.InvariantCulture); 

但是程序中有很多代码使用“Convert.ToDouble”,我不想改变所有代码,另一方面我想知道为什么会发生这种情况。

提前致谢。

您可以使用以下命令设置线程的区域性:

 Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; 

你没有说你在哪里,但输出与当前文化是一致的“。” 作为千位分隔符和十进制逗号而不是小数点。

但是,你说文化是相同的 – 这与此相矛盾。 您或客户是否更改(或自定义)区域和语言选项中的“标准和格式”? 如果设置已自定义,它仍将显示为“英语(英国)”(或任何地方),但会产生与默认值不同的结果。

我既不知道c#也不知道asp.net,但我认为问题在于:你正在以点为单位的文化中进行操作. 是千位分隔符而不是小数分隔符。 你引用的输出就是证据: 40.899,00

你在做什么文化/地区?

文化可以基于运行ASP.Net应用程序的位置,而不是运行浏览器的客户端PC。 虽然他们的台式PC可能具有类似的文化设置,但服务器可能不同。

你的电脑没有给出正确的答案,而不是他们的答案。 您的文化表明“4089.90”与4089900相同,因为点(。)用于分隔数千(因此点后面应该有三个数字)。

看起来您希望将点用作小数分隔符,与文化设置相反; 所以你必须在你的程序中使用System.Globalization.CultureInfo.InvariantCulture 。 抱歉。

实际上非常罕见这种行为导致所有机器具有相同的文化设置,但我认为最好的解决方案是修改web.config,如下所示:

 configuration>     

并应用整个应用程序的设置。

谢谢大家的帮助。

虽然dkantowitz的解决方案可能是最容易快速修复的解决方案,但您应该考虑传递IFormatProvider参数(如第二个代码段中所述),原因如下: http://msdn.microsoft.com/en-us/library/ms182190 (VS.80).aspx 。

从一开始就打开静态代码分析,可以轻松避免这些问题。 如果Visual Studio的SKU不提供此function,您可以转到FxCop – 免费版。

回到建议的解决方案,您应该考虑到任何代码都可以随时更改线程的CurrentCulture,并且根据您的代码库的大小以及处理它的人数,您可以进入不同部分的情况。代码将Thread.CurrentCulture设置为一个不同的值来解决他们的问题,同时弄乱你的问题。