我将自定义字符串写入十进制验证器,需要使用忽略文化的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不是必需的类型。 什么是正确的用法?
答案 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
可以在这里使用。该参数需要IFormatProvider
,CultureInfo
实现的接口。但InvariantCulture
在不随用户设置而变化的意义上是不变的。
事实上,没有任何文化接受,
或.
作为小数分隔符 - 它们都是一个或另一个。您必须找到一些其他方法来处理可以使用这些小数分隔符的数据。
答案 3 :(得分:1)
我无法弄清楚要用什么作为第三个参数。
因为所有文化NumberDecimalSeparator
或NumberGroupSeparator
等都不相同。
有人使用.
作为NumberDecimalSeparator
,有人使用,
,但没有CultureInfo
同时使用NumberDecimalSeparator
。
CultureInfo
实现IFormatProvider
接口。这就是为什么如果您指定CultureInfo
,您的value
字符串会尝试在该文化规则上进行解析。
我正在为需要使用的十进制验证程序编写自定义字符串 忽略文化的Decimal.TryParse
在这种情况下,您可以使用CultureInfo.Clone
method复制所需的文化(或InvariantCulture
),并且可以将NumberDecimalSeparator和NumberGroupSeparator设置为您想要的字符串。
答案 4 :(得分:0)
我知道这是一个非常老的问题,但是当搜索具有不变文化的解析时它仍然会弹出。
我在documentation中发现了以下内容:
不变文化对文化不敏感。你的申请 使用空字符串(“”)通过名称指定不变区域性,或 通过其标识符。
因此,使用此知识,您可以实例化不变文化,如下所示:
culture = new CultureInfo(string.Empty);