Десятичный анализ экспоненциального значения 0 (0 + E3) - PullRequest
2 голосов
/ 29 апреля 2011

Наш средний уровень отправляет нам сериализованные объекты и иногда 0, из-за некоторых математических операций в java на сервере, поступает как 0E + 3.При десериализации объекта мы получаем исключение XmlException -> System.OverflowException, поскольку значение слишком велико или мало для десятичного числа.

Почему десятичная дробь не может быть обработана?

Есть ли способ защитить нашего клиента от этих номеров, поступающих таким образом?

Ответы [ 3 ]

3 голосов
/ 29 апреля 2011

Вы можете попробовать:

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

EDIT:

К сожалению, это не работает для 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 голос
/ 29 апреля 2011

Java, вероятно, выполняет эти вычисления как двойные (что означает, что вам также не нужна дополнительная точность десятичного числа), если они получаются таким образом ... рассмотрите возможность использования двойного вместо десятичного.

Если вам нужно, просто обрежьте E[+-]?([0-9]+)$ вручную с помощью регулярного выражения и выполните умножение самостоятельно. Или сопоставьте ^0E как особый случай (кажется, NumberStyles.Any не может справиться с этим) и просто верните 0.

0 голосов
/ 29 апреля 2011

Измените его на число с плавающей запятой или двойное число, и оно будет правильно анализироваться. Хотя будьте осторожны, точность будет намного ниже (7 цифр для числа с плавающей запятой или 15-16 цифр для двойного числа против 28-29 для десятичного числа).

...