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

Def*_*ult 6 c# floating-point parsing

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

难道"不变文化"不应该忽视文化吗?

请考虑以下示例:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个的输出将是

12
1.2
错误
真实
12

但我期待:

1.2
1.2

真正
1.2

基于 读书InvariantCulture我应该得到这个结果,但我不是.

小智 14

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

,用作小数分隔符,请不要使用CultureInfo.InvariantCulture.相反,使用一个,用作小数分隔符的文化.有许多适合您的需求.

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


qbi*_*bik 5

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

  1. 尝试在不指定文化的情况下解析数字(将使用本地操作系统文化信息),然后尝试使用 InvariantCulture,然后可能尝试一些您希望数字格式化的后备文化。
  2. 用。。。来代替 '。' 并使用不变区域性解析数字字符串。您可能需要确保数字字符串不包含小数组分隔符(如 1,000.00)。