文化不变的Decimal.TryParse()

时间:2014-04-17 11:03:11

标签: c# decimal cultureinfo tryparse

我将自定义字符串写入十进制验证器,需要使用忽略文化的Decimal.TryParse(即如果输入包含"。"或&#34则不关心;,"作为小数点分隔符)。 这是建议的方法:

public static bool TryParse(
    string s,
    NumberStyles style,
    IFormatProvider provider,
    out decimal result
)

我无法弄清楚要用作第三个参数的内容。我见过的例子如下:

culture = CultureInfo.CreateSpecificCulture("en-GB");
Decimal.TryParse(value, style, culture, out number)

所以他们创造了一种特定的文化。 CultureInfo没有" CreateInvariantCulture"方法和CultureInfo.InvariantCulture不是必需的类型。 什么是正确的用法?

5 个答案:

答案 0 :(得分:46)

尝试这样:

decimal value;
bool b = Decimal.TryParse("0.1", NumberStyles.Any, new CultureInfo("en-US"), out value);

最好的方法可能是使用Decimal.Parse()方法,就像传统上使用任何十进制字符串值一样。

您可以使用NumberStyles.Currency指定以货币形式读取值,这将处理任何与货币相关的值(您需要添加对System.Globalalization的引用以使用它:

using System.Globalization;

Decimal.Parse还接受第三个参数,如果你愿意,你可以明确地设置IFormatProvider,并希望你有一个特定的文化:

decimal value = Decimal.Parse(currency, NumberStyles.Currency, CultureInfo.InvariantCulture); //yields 15.55

答案 1 :(得分:7)

我的坏人。我测试了以下代码:

        string DutchDecimal = "1,5";
        string EnglishDecimal = "1.5";
        decimal a;
        decimal b;
        Console.WriteLine(decimal.TryParse(DutchDecimal, out a));
        Console.WriteLine(a);
        Console.WriteLine(decimal.TryParse(EnglishDecimal, out b));
        Console.WriteLine(b);
        Console.Read();

并正确解析两个字符串。似乎默认的TryParse确实是文化不变的。我认为情况并非如此,因为EnterpriseLibrary中的默认TypeConversionValidator依赖于文化,我认为它只是使用了TryParse。但是,事实证明这个默认解析器是硬编码的,以使用当前的文化。

编辑:我发现" 1.5"转换为1.5和" 1,5"转换为15.这对于文化不变行为实际上是正确的,所以就是这样。这整个问题显然是由于我对文化不变性的误解而产生的。

答案 2 :(得分:4)

事实上,CultureInfo.InvariantCulture可以在这里使用。该参数需要IFormatProviderCultureInfo实现的接口。但InvariantCulture在不随用户设置而变化的意义上是不变的。

事实上,没有任何文化接受,.作为小数分隔符 - 它们都是一个或另一个。您必须找到一些其他方法来处理可以使用这些小数分隔符的数据。

答案 3 :(得分:1)

  

我无法弄清楚要用什么作为第三个参数。

因为所有文化NumberDecimalSeparatorNumberGroupSeparator等都不相同。

有人使用.作为NumberDecimalSeparator,有人使用,,但没有CultureInfo同时使用NumberDecimalSeparator

CultureInfo实现IFormatProvider接口。这就是为什么如果您指定CultureInfo,您的value字符串会尝试在该文化规则上进行解析。

  

我正在为需要使用的十进制验证程序编写自定义字符串   忽略文化的Decimal.TryParse

在这种情况下,您可以使用CultureInfo.Clone method复制所需的文化(或InvariantCulture),并且可以将NumberDecimalSeparator和NumberGroupSeparator设置为您想要的字符串。

答案 4 :(得分:0)

我知道这是一个非常老的问题,但是当搜索具有不变文化的解析时它仍然会弹出。

我在documentation中发现了以下内容:

  

不变文化对文化不敏感。你的申请   使用空字符串(“”)通过名称指定不变区域性,或   通过其标识符。

因此,使用此知识,您可以实例化不变文化,如下所示:

culture = new CultureInfo(string.Empty);