有没有办法让Decimal.TryParse将字符串值"0.0"或"00.00"或"000.000"解析为0?
我已经尝试将NumberStyles设置为Any.
tva*_*son 13
使用InvariantCulture,decimal.TryParse成功地将所有这些字符串解释为零.这段代码,例如:
decimal num = 66;
foreach (var str in new string[] { "0.0", "00.00", "000.000" })
{
if (!decimal.TryParse(str, out num))
{
Console.WriteLine( "fail" );
}
Console.WriteLine(num);
}
Run Code Online (Sandbox Code Playgroud)
生成此输出:
0.0
0.00
0.000
Run Code Online (Sandbox Code Playgroud)
也许,问题是打印值,而不是解析值?如果是这种情况,只需使用指定小数位是可选的格式字符串.
Console.WriteLine( num.ToString( "#0.#" ) );
Run Code Online (Sandbox Code Playgroud)
产生
0
0
0
Run Code Online (Sandbox Code Playgroud)
有没有办法让Decimal.TryParse解析字符串值
"0.0"或"00.00"或"000.000"为0?
我正在解释你的问题.假设我接受了字符串"0.0","00.00"并"000.000"要求Decimal.TryParse解析它们.当我写出来所产生的小数我看到控制台0.0,0.00并0.000分别.有没有办法在所有这些将被写入控制台的情况下Decimal.TryParse返回?decimal0
不,想想为什么会这样.Decimal类型代表精确数字; 在某些圆圈中,0.00被认为比精确度0.0更精确0.如果Decimal.TryParse被截断,那么精度比该Decimal类型对这些目的无用.
也就是说,在调用parse之前修剪尾随的零很容易:
static char[] whitespaceAndZero = new[] {
' ',
'\t',
'\r',
'\n',
'\u000b', // vertical tab
'\u000c', // form feed
'0'
};
static string TrimEndWhitespaceAndZeros(string s) {
return s.Contains('.') ? s.TrimEnd(whitespaceAndZero) : s;
}
static bool TryParseAfterTrim(string s, out decimal d) {
return Decimal.TryParse(TrimEndWhiteSpaceAndZeros(s), out d);
}
Run Code Online (Sandbox Code Playgroud)
用法:
string s = "0.00";
decimal d;
TryParseAfterTrim(s, out d);
Console.WriteLine(d);
Run Code Online (Sandbox Code Playgroud)
输出:
0
Run Code Online (Sandbox Code Playgroud)
请注意,上面只显示了如何解决问题的关键.您可以自行决定是否以及如何处理本地化问题.至少,把这个投入生产之前,您应该考虑更换硬编码'.'用CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator.你应该考虑TryParseAfterTrim使用相同的参数列表进行重载Decimal.TryParse.那是:
bool TryParseAfterTrim(
string s,
NumberStyle style,
IFormatProvider provider,
out decimal result
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15405 次 |
| 最近记录: |