Десятичный анализ экспоненциального значения 0 (0+E3)

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

Почему decimal.Parse не может обработать это преобразование?

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


person Ben    schedule 29.04.2011    source источник
comment
Не могли бы вы создать и использовать метод расширения для анализа экспоненциального или десятичного форматов?   -  person JeffSahol    schedule 29.04.2011
comment
Вы уверены, что вам нужна десятичная дробь .NET? Вы пробовали float или double вместо этого?   -  person Simon Mourier    schedule 29.04.2011
comment
Это финансовая система, поэтому мы не можем позволить себе терять точность дробных акций.   -  person Ben    schedule 29.04.2011


Ответы (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);
}
person Patrick McDonald    schedule 29.04.2011
comment
В данном случае это было 3. Я не знаю, получится ли это с другими значениями. Однако мы не управляем синтаксическим анализом. Он десериализуется в компонентах json. - person Ben; 29.04.2011
comment
Есть ли способ сообщить компоненту json, как что-то анализировать или какой тип сопоставить? (возможно, вы можете создать собственный тип, который может десериализовать строку 0E+3) - person Random832; 29.04.2011
comment
Я согласен, что это ошибка. Я не знаю, почему процедура синтаксического анализа не может справиться с этим. Я думаю, что мне, возможно, придется либо найти способ сделать собственный сериализатор, либо взять значение в строку, а затем вручную проанализировать десятичное число. - person Ben; 30.04.2011
comment
Однако C# может обрабатывать 0,000E+3 и превращает его в десятичный 0. Он не может обрабатывать 0,00E+3. Выдает ту же ошибку. - person Ben; 03.05.2011

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

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

person Random832    schedule 29.04.2011
comment
Сторона Java использует BigDecimal. Java также получает XML-документ с показателями в определенных полях количества, а затем вычитает эти значения. Иногда значения приводят к 0. Когда java управляет BigDecimal и начинает с показателя степени, возвращает ли она также результаты вычитания как показатели степени? - person Ben; 29.04.2011

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

person Yuriy Faktorovich    schedule 29.04.2011