如何让Decimal.TryParse解析0.0?

Aar*_*her 8 .net c#

有没有办法让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)

  • 请注意,在调用`TryParse`时,您已经硬编码了"0.0".我确信,如果你传入`str`,你会在控制台上看到`0.0`,`0.00`和`0.000`. (2认同)

jas*_*son 5

有没有办法让Decimal.TryParse解析字符串值"0.0""00.00""000.000"为0?

我正在解释你的问题.假设我接受了字符串"0.0","00.00""000.000"要求Decimal.TryParse解析它们.当我写出来所产生的小数我看到控制台0.0,0.000.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)

  • 里面有一个大错误的坏方案!如果您使用TrimZero解析例如"10",结果将为1,这是错误的.您应该将此答案提交给Dailywtf.com (4认同)
  • 我明白你的精确度,但如果你要抛弃尾随的零,我认为你应该在输出上做到这一点 - 而且用格式字符串很容易. (2认同)