我正在为需要使用 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 不是所需的类型。 正确的用法是什么?
其实
CultureInfo.InvariantCulture
可以用在这里。该参数需要 IFormatProvider
,一个 CultureInfo
实现的接口。但是InvariantCulture
在不随用户设置变化的意义上是不变的。
事实上,没有一种文化接受
,
或 .
作为小数点分隔符——它们都是一个或另一个。您必须找到其他方法来处理可以使用这些小数点分隔符中的任何一个的数据。
我的坏人。我测试了以下代码:
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();
事实上它没有正确解析荷兰小数,而是在这种情况下返回
15
,忽略无法识别的,
。事实证明,默认解析器行为被硬编码为使用当前运行线程的当前文化。
我不知道用什么作为第三个参数。
NumberDecimalSeparator
或NumberGroupSeparator
等..不一样。
Someones uses
.
as a NumberDecimalSeparator
, someone uses ,
but there is no CultureInfo
that used both as a NumberDecimalSeparator
.
CultureInfo
实现IFormatProvider
接口。这就是为什么如果您指定 CultureInfo
,您的 value
字符串会尝试根据该文化规则进行解析。
我正在将自定义字符串写入需要使用的十进制验证器 忽略文化的 Decimal.TryParse
CultureInfo.Clone
方法复制您想要的文化(或InvariantCulture
),您可以设置NumberDecimalSeparator和NumberGroupSeparator你想要的字符串。
我知道这是一个很老的问题,但在搜索 parsing with invariant culture 时它仍然会弹出
我在文档中发现了以下内容:
不变的文化是文化不敏感的。你的申请 使用空字符串 ("") 或按名称指定不变区域性 通过它的标识符。
因此,利用这些知识,您可以像这样实例化一个不变的文化:
culture = new CultureInfo(string.Empty);