【问题标题】:double.Parse throw a System.FormatExceptiondouble.Parse 抛出 System.FormatException
【发布时间】:2013-09-17 10:34:44
【问题描述】:

我正在尝试使用此解析方法重载将一些字符串解析为双精度值:

double.Parse("198.222213745118", CultureInfo.CurrentUICulture);

CultureInfo.CurrentUICulture 是 fr-FR。 但这会引发 FormatException 类型的异常。

可能是什么原因?

【问题讨论】:

  • 198.222213745118 应该是 198,222213745118, 而不是 .)?
  • 对,但我认为这是这个double.parse方法的工作
  • 使用CultureInfo.InvariantCulture
  • 不,它不能完全通用。例如1,234 在英国是一千二百三十四,在法国略多于 1
  • 如果您可以控制字符串,您可能需要使用NumberDecimalSeparator

标签: c# formatexception


【解决方案1】:

法语(即fr-FR)使用逗号来表示小数部分的开始,而不是句点。他们使用句点来分隔数千。

【讨论】:

  • 当然,但是出于这个原因,我将我的文化发送到了 parse 方法。
  • @user2717436,文化需要和UI控件中的一致。
  • 是的,没错,千位分隔符部分只有书面语言,罗马尼亚文化也是如此。 double.Parse 不代表.,它会抛出异常。
  • 那我该怎么做呢?我的意思是 - 这个字符串是从 xml 文件中读取的,我得到它就像这样(带有“,”分隔符)。如何将其解析为双倍取决于我的文化?
  • XML 文件应使用特定格式。指定一种文化,其格式与 XML 文件中使用的格式一致。
【解决方案2】:

我知道这个问题很老,但我的回答可能对其他人有所帮助。 所以这就是答案:

double.Parse("198.222213745118", System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.InvariantInfo);

而不是

double.Parse("198.222213745118", CultureInfo.CurrentUICulture);

【讨论】:

    【解决方案3】:

    我建议使用 Double.TryParse 而不是 .Parse,因为它使用起来更安全,并确保您在解析时不会遇到任何异常。

    这里有一个代码供你使用,

    double answer = -1;
    Double.TryParse("Value", out answer);
    

    现在你要做的就是做一个条件语句来检查它是否确实解析了字符串。

    【讨论】:

    • 由于模棱两可,这是一个非常非常糟糕的主意。例如。它会用 1,234 做什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    相关资源
    最近更新 更多