用千位分隔符解析小数
Parsing decimal with thousands separator
我有以下代码块:
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
变量的原因。
我做错了什么?
如果您 AND-结合 NumberStyles
-标志,您将得到 None
。
00100000 (AllowDecimalPoint)
&
01000000 (AllowThousands)
--------
00000000 (None)
尝试或-将它们组合:NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands
00100000 (AllowDecimalPoint)
|
01000000 (AllowThousands)
--------
01100000 (AllowDecimalPoint, AllowThousands)
此外,恐怕您无法用一个语句解析两种种风格(美国风格和德国风格)。
所以我会尝试两者:
string price = "1,234.56";
decimal value = 0;
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands);
if (Decimal.TryParse(price, allowedStyles, CultureInfo.GetCultureInfo("DE-de"), out value))
{
Console.Write("Danke!");
}
else if (Decimal.TryParse(price, allowedStyles, CultureInfo.GetCultureInfo("EN-us"), out value))
{
Console.Write("Thank you!");
}
else
{
throw new InvalidFormatException();
}
这个二进制 and
(&
) 的结果将始终是 0
(false
,或 NumberStyles.None
)。这就是为什么它不允许小数点和千位分隔符:
var allowedStyles = (NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands);
更改为二进制 or
(|
):
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands);
我有以下代码块:
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
变量的原因。
我做错了什么?
如果您 AND-结合 NumberStyles
-标志,您将得到 None
。
00100000 (AllowDecimalPoint)
&
01000000 (AllowThousands)
--------
00000000 (None)
尝试或-将它们组合:NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands
00100000 (AllowDecimalPoint)
|
01000000 (AllowThousands)
--------
01100000 (AllowDecimalPoint, AllowThousands)
此外,恐怕您无法用一个语句解析两种种风格(美国风格和德国风格)。
所以我会尝试两者:
string price = "1,234.56";
decimal value = 0;
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands);
if (Decimal.TryParse(price, allowedStyles, CultureInfo.GetCultureInfo("DE-de"), out value))
{
Console.Write("Danke!");
}
else if (Decimal.TryParse(price, allowedStyles, CultureInfo.GetCultureInfo("EN-us"), out value))
{
Console.Write("Thank you!");
}
else
{
throw new InvalidFormatException();
}
这个二进制 and
(&
) 的结果将始终是 0
(false
,或 NumberStyles.None
)。这就是为什么它不允许小数点和千位分隔符:
var allowedStyles = (NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands);
更改为二进制 or
(|
):
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands);