为什么double.Parse("0.05")返回5.0?

6

我正在从我的App.config中读取一个值; 它是:

 <add key="someValue" value="0.05"/>

我尝试通过以下方式将其转换为双精度数:

 var d = double.Parse(ConfigurationManager.AppSettings["someValue"]);

我得到的是5.0而不是0.05。

你能给予建议吗?我做错了什么,应该如何解析它?


类似问题:https://dev59.com/0HRB5IYBdhLWcg3wF0DH - doblak
我建议使用public static double Parse(string s, NumberStyles style, IFormatProvider provider)。当您将一个string变量设置为ConfigurationManager.AppSettings["someValue"]时,具体会发生什么,似乎您并没有真正尝试调试您的代码。 - Security Hound
5个回答

9

这是针对你的文化设置的。测试同样的内容,但使用逗号而不是点号,你会发现它可以工作。

var d = double.Parse("0,05");

为了解决这个问题,您可以使用parse函数的以下重载。
var d = double.Parse(ConfigurationManager.AppSettings["someValue"], CultureInfo.InvariantCulture);

首先,这并不意味着我抄袭了那个问题。其次,我有一个几个月前提出的与此问题相关的问题。因为在我的国家,我们使用逗号而不是点。http://stackoverflow.com/questions/10507759/convert-this-string-into-decimal。第二,当我编辑我的答案时,我正在查找那个问题的答案,以查看重载的正确语法。 - Jorge
1
@Jorge - 所以无论如何,您只是引用了别人的话并更改了值。此外,在这种情况下最好使用public static double Parse(string s, NumberStyles style, IFormatProvider provider) - Security Hound
@Jorge:没问题,但你应该引用答案。 - user195488

7
也许问题出在文化设置上。这可能会带来很多问题,例如逗号作为数字分隔符。当您处理非文化值(如配置文件)时,应明确指定需要InvariantCulture。请尝试:
var d = double.Parse(ConfigurationManager.AppSettings["someValue"],
                     CultureInfo.InvariantCulture);

4
因为一些文化将“,”视为分数分隔符(小数点),而将“。”视为每3位数字的分隔符。 - Alvin Wong

5
这段代码:
var nfi = new NumberFormatInfo {
    NumberGroupSeparator = ".",
    NumberDecimalSeparator = ","
};
Console.WriteLine(double.Parse("0.05", nfi));

输出了5,因此问题可能出在您的区域设置上。

请尝试

var d = double.Parse(
    ConfigurationManager.AppSettings["someValue"], 
    CultureInfo.InvariantCulture);

0

在使用double.Parse时,始终传递您的文化信息。在比利时,它是“0,05”。


-1

这是由于文化设置引起的。请确保“.”是您当前文化中的分隔符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接