【发布时间】:2015-03-19 14:26:52
【问题描述】:
我有以下代码块:
string price = "1,234.56";
decimal value = 0;
var allowedStyles = (NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands);
if (Decimal.TryParse(price, allowedStyles, CultureInfo.InvariantCulture, out value))
{
Console.log("Thank you!");
}
else
{
throw new InvalidFormatException();
}
最终,price 将采用美国风格(即 1,234.56)或德国风格(即 1.234,56)。我现在面临的挑战是,Decimal.TryParse 失败了。我怀疑它是因为千位分隔符。这就是我添加allowedStyles 变量的原因。
我做错了什么?
【问题讨论】:
-
尝试传递
CultureInfo.CurrentCulture而不是InvariantCulture作为第三个参数。这将使TryParse适应当前机器的语言环境。 -
@CompuChip:我不太确定。通常使用
InvariantCulture是有意的。 -
如果是解析币种,
NumberStyles.Currency呢? -
您是从后端系统还是从用户获取输入?如果您从您控制的后端获取输入,您应该标准化单一格式——InvariantCulture 是一种合适的方式来做到这一点。如果您无法控制格式,希望有一些更高级别的协议可以让您知道您使用的是 DE 还是 US,否则您会有歧义(这些可以通过比 Decimal.Parse 接受的更严格的正则表达式来缓解可以选择合适的文化)。来自用户的输入应使用 CurrentCulture。
标签: c# globalization