【问题标题】:Why double.Parse("0.05") returns 5.0?为什么 double.Parse("0.05") 返回 5.0?
【发布时间】:2012-07-12 15:31:18
【问题描述】:

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

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

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

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

我得到 5.0 而不是 0.05。

你能建议吗?我做错了什么,我应该如何解析这个?

【问题讨论】:

  • 我建议改用public static double Parse(string s,NumberStyles style,IFormatProvider provider)。当您将string 变量设置为ConfigurationManager.AppSettings["someValue"] 时究竟会发生什么,您似乎并没有真正尝试调试您的代码。

标签: c# .net parsing double


【解决方案1】:

这是针对您的文化设置的,测试相同,但用逗号代替点,您会看到该作品的

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

要解决此问题,您可以使用解析函数的跟随重载

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

【讨论】:

  • 首先这并不意味着我复制了那个,其次我有几个月前就这个问题提出的问题。因为在我的国家我们用逗号代替了点。 stackoverflow.com/questions/10507759/…。其次,当我编辑我的答案时,我正在寻找该问题的答案,以查看重载的正确语法
  • @Jorge - 无论哪种方式,您都只是引用了其他人并更改了值。此外,在这种情况下使用public static double Parse( string s, NumberStyles style, IFormatProvider provider) 会更好。
  • @Jorge:很好,但你应该参考答案。
【解决方案2】:

也许问题出在文化设置上。它们可能存在许多问题,例如逗号作为数字分隔符。当您使用非文化值时,例如配置文件,您应该明确指定您需要 InvariantCulture。试试

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

【讨论】:

  • 因为某些文化将, 视为分数分隔符(十进制标记),将. 视为每 3 位数字的分隔符
【解决方案3】:

这段代码:

var nfi = new NumberFormatInfo {
    NumberGroupSeparator = ".",
    NumberDecimalSeparator = ","
};
Console.WriteLine(double.Parse("0.05", nfi));

也会打印5,所以问题出在你的文化设置上。

试试

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      这是因为文化设置。请确保 ”。”是您当前文化中的分隔符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-24
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 2023-03-05
        • 2016-05-20
        相关资源
        最近更新 更多