文化不变的Decimal.TryParse()
我正在为十进制validation器编写一个自定义字符串,需要使用忽略文化的Decimal.TryParse(即不关心输入是否包含“。”或“,”作为小数点分隔符)。 这是建议的方法:
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不是必需的类型。 什么是正确的用法?
试试这样:
decimal value; bool b = Decimal.TryParse("0.1", NumberStyles.Any, new CultureInfo("en-US"), out value);
最好的方法可能是使用Decimal.Parse()方法,就像传统上使用任何十进制字符串值一样。
您可以使用NumberStyles.Currency指定以货币forms读取值,这将处理任何与货币相关的值(您需要添加对System.Globalalization的引用以使用它:
using System.Globalization;
Decimal.Parse还接受第三个参数,如果您选择并希望特定的文化,则允许您显式设置IFormatProvider
:
decimal value = Decimal.Parse(currency, NumberStyles.Currency, CultureInfo.InvariantCulture); //yields 15.55
我的坏人 我测试了以下代码:
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。 但是,事实certificate这个默认解析器是硬编码的,以使用当前的文化。
编辑:我发现“1.5”转换为1.5,“1,5”转换为15.这对于文化不变行为实际上是正确的,所以就是这样。 这整个问题显然是由于我对文化不变性如何运作的误解而产生的。
事实上, CultureInfo.InvariantCulture
可以在这里使用。 该参数需要IFormatProvider
,这是CultureInfo
实现的接口。 但InvariantCulture
在不随用户设置而变化的意义上是不变的。
事实上,没有任何文化可以接受,
或者.
作为小数分隔符 – 它们都是一个或另一个。 您将不得不找到一些其他方法来处理可以使用这些小数分隔符的数据。
我无法弄清楚要用什么作为第三个参数。
因为所有文化的NumberDecimalSeparator
或NumberGroupSeparator
等都不一样。
有人使用.
作为NumberDecimalSeparator
,有人使用,
但没有CultureInfo
同时使用它们作为NumberDecimalSeparator
。
CultureInfo
实现了IFormatProvider
接口。 这就是为什么如果你指定CultureInfo
,你的value
字符串会尝试在该文化规则上进行解析。
我正在为十进制validation器编写一个自定义字符串,需要使用忽略文化的Decimal.TryParse
在这种情况下,您可以使用CultureInfo.Clone
方法来复制所需的文化(或InvariantCulture
),并且可以设置NumberDecimalSeparator和NumberGroupSeparator所需的字符串。