指数0值的十进制解析(0 + E3)

时间:2011-04-29 16:02:32

标签: c# parsing decimal overflowexception

我们的中间层向我们发送序列化对象,有时为0,由于服务器上的Java中的一些数学运算,来自0E + 3。反序列化对象时,我们得到一个XmlException - > System.OverflowException,因为小数值太大或太小。

为什么decimal.Parse无法处理此转换?

有没有办法以这种方式保护我们的客户免受这些数字的影响?

3 个答案:

答案 0 :(得分:3)

你可以尝试:

decimal.Parse(numberText, System.Globalization.NumberStyles.Any)

编辑:

这不适用于0E + 3

使用:

Console.WriteLine(decimal.Parse("0", System.Globalization.NumberStyles.Any));
Console.WriteLine(decimal.Parse("123.45", System.Globalization.NumberStyles.Any));
Console.WriteLine(decimal.Parse("1.35E+6", System.Globalization.NumberStyles.Any));
Console.WriteLine(decimal.Parse("1.54E-5", System.Globalization.NumberStyles.Any));

不起作用:

Console.WriteLine(decimal.Parse("0E+3", System.Globalization.NumberStyles.Any));

问题编号是否始终为0E + 3?

如果是这样,你可以编写一个帮助方法来处理这个问题:

decimal ParseDecimal(string number)
{
    if (number.Equals("0E+3", StringComparison.OrdinalIgnoreCase))
    {
        return 0;
    }

    return decimal.Parse(number, System.Globalization.NumberStyles.Any);
}

答案 1 :(得分:1)

如果它们以这种方式出现,那么Java可能正在将此计算作为double(这意味着您也不需要Decimal的额外精度)...考虑使用double而不是decimal。

如果必须,只需用正则表达式手动修剪E[+-]?([0-9]+)$并自行进行乘法运算。或者将^0E与特殊情况匹配(似乎NumberStyles.Any无法处理它)并返回0。

答案 2 :(得分:0)

将其更改为float或double,它将正确解析它。虽然要小心,但精度要低得多(浮点数为7位数,双数位数为15-16位,小数点数为28-29位数)。