【问题标题】:Decimal.TryParse - missing separator?Decimal.TryParse - 缺少分隔符?
【发布时间】:2015-01-15 20:54:51
【问题描述】:

我在使用 API 时遇到了奇怪的情况。我得到 JSON 中的对象,我对其进行反序列化。此对象包含解析为十进制的字符串属性。

为此,我使用此代码。我住在波兰,小数点分隔符是',',所以我使用替换方法。

string input ="160.00"; //value from API

decimal result;
decimal.TryParse(input.Replace('.',','), out result);

有时我的结果等于 16000! (我想 TryParse 方法删除分隔符,它没有确定)。 我怎样才能防止这种情况?我可以解析吗

【问题讨论】:

  • 为什么不为TryParse的调用指定文化而不是交换小数分隔符?
  • 你能写一些示例代码吗?

标签: c# .net decimal tryparse valueconverter


【解决方案1】:

无论如何,数字都应序列化为InvariantCulture,因此用于解析的InvariantCulture 是一个好的开始。序列化数字的代码也应该检查它是否遵循这个规则

string input ="160.00";
decimal result = decimal.Parse(
    input, 
    System.Globalization.CultureInfo.InvariantCulture);

不将数字序列化为文化不变是最常见的问题来源之一,例如 它在我的机器上运行我不知道为什么它不在你的机器上......哦,你说你的系统是不同的语言 哎呀 ;-)

【讨论】:

  • 即使是一家开发非常复杂的 3d cad 软件的大公司,他们的库中也存在这个错误。在我使用英语系统的我们公司,一切都很好,但是客户有一个德语系统并且不得不切换语言,因为没有其他方法可以运行某些功能,因为它们生成了无效的 cad 文件,而且这对他们来说是不可能的修复它(不支持)。
  • 如果 API 根据文化返回不同的值,这将无法正常工作。如果 API 返回 160,00,您的代码将返回 16000 作为结果。但如果该值始终带有 .,那么您的解决方案可能会更好。
  • 是的,这是真的。这就是为什么我也写信检查序列化以确保数字始终采用正确格式。
  • 对不起,我太累了,没看清楚,你说得对!
【解决方案2】:

您应该使用TryParse 方法的适当重载,而不是替换小数点字符,即decimal.TryParse(String, NumberStyles, IFormatProvider, Decimal)

string input ="160.00";
NumberStyles style = NumberStyles.Number;
decimal number = 0;

CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
decimal.TryParse(input, style, culture, out number)

确保指定适合您情况的正确文化。

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2018-04-25
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多