如何使InvariantCulture将逗号识别为小数分隔符?

时间:2014-06-23 21:50:46

标签: c# parsing floating-point

如何使用1,2解析Single.Parse?提问的原因是,当我使用CultureInfo.InvariantCulture时,我不会按照自己的意愿获得1.2,而是12。

不应该"不变的文化"忽视文化?

Consider the following example

using System;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Single.Parse("1,2", CultureInfo.InvariantCulture));
        Console.WriteLine(Single.Parse("1.2", CultureInfo.InvariantCulture));
        float value;
        Console.WriteLine(Single.TryParse("1,2", NumberStyles.Float, CultureInfo.InvariantCulture, out value));
        Console.WriteLine(Single.TryParse("1,2", out value));
        Console.WriteLine(value);
    }
}

这个输出将是

  

12
  1.2
  假
  真
  12

但我在期待:

  

1.2
  1.2
  真
  真
  1.2

InvariantCulture的{​​{3}} Based on my我应该得到这个结果,不过我不是。

2 个答案:

答案 0 :(得分:12)

CultureInfo.InvariantCulture使用.作为小数点分隔符,,作为千位分隔符。这与任何用户设置无关,并且与您获得的字符串无关,因此名称为“InvariantCulture”。具体详细信息列在NumberFormatInfo.InvariantInfo MSDN页面上。

要使用,作为小数点分隔符,请不要使用CultureInfo.InvariantCulture。相反,请使用使用,作为小数分隔符的区域性。有许多适合您的需求。

或者,根据CultureInfo.InvariantCulture创建自定义文化。您可以调用其Clone方法来创建可以修改属性的副本。

答案 1 :(得分:4)

您链接的一篇文章说“不变文化与英语内部相关”。所以'InvariantCulture'并不意味着“尝试匹配任何文化”。这意味着:忽略本地系统文化设置,并将此数字视为特定标准格式(基本上是:英国文化标准)。 因此,如果您想处理不同的格式,请在此处选择:

  1. 尝试解析没有specyfing文化的数字(将使用本地操作系统文化信息),然后尝试使用InvariantCulture,然后尝试一些后备文化,您希望格式化数字。
  2. 将','替换为'。'并使用Invariant culture解析数字字符串。您可能希望确保数字字符串不包含小数组分隔符(如1,000.00)。