我们的中间层向我们发送序列化对象,有时为0,由于服务器上的Java中的一些数学运算,来自0E + 3。反序列化对象时,我们得到一个XmlException - > System.OverflowException,因为小数值太大或太小。
为什么decimal.Parse无法处理此转换?
有没有办法以这种方式保护我们的客户免受这些数字的影响?
答案 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位数)。