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

9
我该如何使用 Single.Parse 解析 1,2?我提出这个问题的原因是,当我使用 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);
    }
}

此代码的输出结果将为:
12 1.2 False True 12
但我期望的是:
1.2 1.2 True True 1.2
根据我对InvariantCulture的了解,我应该得到这个结果,但实际上并没有。此文参考了以下链接:Based on my reading of InvariantCulture

1
var single = float.Parse("1,2", CultureInfo.GetCultureInfo("tr-TR")); - L.B
好的,我来加入:var single = float.Parse("1,2", CultureInfo.GetCultureInfo("nl-NL")); 基本上,InvariantCulture 使用 . 作为小数分隔符。Single.Parse 不会忽略它,但是在 InvariantCulture, 不是 小数分隔符。 - user743382
2
@Default 它使用一个固定的文化,该文化恰好使用“,”作为小数分隔符。任何使用“,”的文化都可以。重要的是不使用用户的文化。 - user743382
4
你需要决定字符串的格式。如果它们总是使用句点,请使用"InvariantCulture";如果它们总是使用逗号,请使用不同但仍然固定的文化;如果它们可能包含两者,那么你就有问题了:无法确定1,000代表一个还是一千。 - user743382
@默认情况下,我不这么认为,但我也不完全确定。但即使是不使用千位分隔符的文化,通常也会具有可用于解析的千位分隔符。 - user743382
显示剩余3条评论
2个回答

23

CultureInfo.InvariantCulture 使用 . 作为小数点分隔符,使用 , 作为千位分隔符。这与任何用户设置无关,也与您拥有的字符串无关,因此被称为“InvariantCulture”。具体细节列在 NumberFormatInfo.InvariantInfo MSDN 页面上。

如果要使用 , 作为小数点分隔符,请不要使用 CultureInfo.InvariantCulture。而是使用一个使用 , 作为小数点分隔符的区域设置。有许多区域设置可以满足您的需求。

或者,基于 CultureInfo.InvariantCulture 创建自定义区域设置。您可以调用其 Clone 方法创建一个副本,然后修改属性。


InvariantCulture 使用 . 作为小数分隔符是否有保证?我(相当)确定千位分隔符不会被使用,因此 string.Replace 将是“安全”的(正如您在评论中提到的)。在克隆的 CultureInfo 中替换千位分隔符似乎对解析没有任何影响。 - default
1
@默认是的,我提供的链接中NumberFormatInfo.InvariantInfo页面指出值不会更改,并提到示例程序输出"NumberDecimalSeparator ."。将这两者结合起来,您可以相当确定它不会面临更改。 - user743382

5
你所提供的其中一篇文章中提到:“Invariant Culture 内部与英语关联”。因此,“InvariantCulture”并不意味着“尝试匹配任何文化”。它的意思是:忽略本地系统文化设置,并将这个数字视为按照特定标准(基本上是英语文化标准)格式化。所以,如果你想处理不同的格式,你有以下几个选项:
1. 尝试在不指定文化的情况下解析数字(将使用本地操作系统文化信息),然后尝试使用InvariantCulture,最后可能尝试一些你期望数字被格式化的回退文化。
2. 用 Invariant 文化替换“,”为“。”,然后解析数字字符串。你可能需要确保数字字符串不包含小数分组分隔符(如 1,000.00)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接