【问题标题】:How to make InvariantCulture recognize a comma as a decimal separator?如何让 InvariantCulture 将逗号识别为小数分隔符?
【发布时间】:2014-06-23 21:50:46
【问题描述】:

如何用Single.Parse 解析1,2?问的原因是因为,当我使用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

Based on my reading of InvariantCulture 我应该得到那个结果,但我没有。

【问题讨论】:

  • var single = float.Parse("1,2", CultureInfo.GetCultureInfo("tr-TR"));
  • 好吧,我将加入:var single = float.Parse("1,2", CultureInfo.GetCultureInfo("nl-NL")); 基本上,InvariantCulture 使用. 作为小数分隔符。 Single.Parse 不会忽略它,但 , 不是 InvariantCulture 中的小数分隔符。
  • @Default 它使用固定的文化,恰好使用, 作为小数分隔符。任何使用, 的文化都可以。重要的是用户的文化是使用的。
  • @hvd - 如果我随后转移到使用另一个小数分隔符的区域性,我将如何处理 other 分隔符?我是否真的需要使用三种文化(我目前的一种使用. 和一种使用,)来正确解析小数点......?这看起来很……笨重……
  • @Default 您需要确定字符串的格式。如果它们总是使用句点,请使用InvariantCulture。如果他们总是使用逗号,请使用不同的(但仍然是固定的)文化。如果它们可能包含其中任何一个,那么您就会遇到问题:您无法确定 1,000 代表一还是一千。

标签: c# parsing floating-point


【解决方案1】:

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

要使用, 作为小数分隔符,请勿使用CultureInfo.InvariantCulture。相反,使用确实使用, 作为小数分隔符的区域性。有很多可以满足您的需求。

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

【讨论】:

  • 是否保证InvariantCulture 使用. 作为小数分隔符?我(相当)确定不会使用千位分隔符,因此 string.Replace 将是“安全的”(正如您在评论中提到的那样)。在解析时替换克隆 CultureInfo 中的千位分隔符似乎没有任何区别。
  • @Default 是的,我链接到的NumberFormatInfo.InvariantInfo 页面提到值不会改变,并提到示例程序输出“NumberDecimalSeparator .”。将这两者结合起来,您可以相当确定它不会发生变化。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2014-01-04
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多