【发布时间】:2014-12-12 12:13:16
【问题描述】:
我想将文本输入中的字符串解析为十进制。该值表示货币值。
目前我得到了这个解决方案:
private Decimal CastToDecimal(string value)
{
Decimal result;
var valid = Decimal.TryParse(value, NumberStyles.Currency, null, out result);
return valid ? result : -1;
}
到目前为止,这工作得很好,除了可能的文化差异。我是德国人,我希望大多数用户输入德国风格的波动。但也有可能有人使用“.”。而不是“,”,转换将失败。
"123,45€" => 123.45
“123.456,78€” => 123456.78
"123.45€" => 12345
有没有办法自动检测所使用的文化以获取十进制值?这样无论你使用德语还是英语标点,你仍然得到相同的结果?
更新:
感谢您的帮助,我创建了一种方法,可以满足我的需求(我认为)。
private static Decimal CastToDecimal(string value)
{
Decimal resultDe;
Decimal resultEn;
var style = NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands;
var cultureDe = CultureInfo.CreateSpecificCulture("de-DE");
var cultureEn = CultureInfo.CreateSpecificCulture("en-GB");
var deValid = Decimal.TryParse(value, style, cultureDe, out resultDe);
var enValid = Decimal.TryParse(value, style, cultureEn, out resultEn);
var minVal = Math.Min(resultDe, resultEn);
var maxVal = Math.Max(resultDe, resultEn);
if (!deValid)
return resultEn;
if (!enValid)
return resultDe;
return BitConverter.GetBytes(decimal.GetBits(minVal)[3])[2] > 2 ? maxVal : minVal;
}
这段代码...
Console.WriteLine(CastToDecimal("123,45"));
Console.WriteLine(CastToDecimal("123.45"));
Console.WriteLine(CastToDecimal("123,450"));
Console.WriteLine(CastToDecimal("123.450"));
Console.WriteLine(CastToDecimal("123.123,45"));
Console.WriteLine(CastToDecimal("123,123.45"));
返回这个:
123,45
123,45
123450
123450
123123,45
123123,45
【问题讨论】:
-
没有。您需要知道使用哪种文化来格式化它。或者在任何地方使用
InvariantCulture。这是my answer 非常相关的问题。 -
但
123.456表示英国标点符号的 123.456 和德语的 123456!所以没有明确的方法来消除歧义。 -
由于该字段仅用于货币,因此 123.456 将是 123456,因为没有半美分。如果分隔符右侧的数字少于 3 位,则仅是分隔符
-
@AlexanderMills 这可能适用于您的钱包,但不适用于某些计算产品平均价格的应用程序。
-
是的,但是 decimal.Parse 不理解它只看到一个字符串的上下文。您应该能够获取用户的文化,然后传入适当的
CultureInfo,以便解析正常工作和失败。
标签: c#