Разбор числа из экспоненциальной нотации
Мне нужно разобрать строку "1.2345 E-02" (Число, выраженное в экспоненциальной нотации) на десятичный тип данных, но Decimal.Parse("1.2345E-02")
просто выдает ошибку
7 ответов:
Это число с плавающей запятой, вы должны сказать ему, что:
decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);
это работает, если вы укажите
NumberStyles.Float
:decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float); Console.WriteLine(x); // Prints 0.012345
Я не совсем уверен, почему это не поддерживается по умолчанию - по умолчанию используется
NumberStyles.Number
, который использует стили AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint и AllowThousands. Возможно, это связано с производительностью; указание экспоненты относительно редкая, я полагаю.
static void Main(string[] args) { decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float); }
Я нашел, что проходя в
NumberStyles.Float
, в некоторых случаях изменяет правила, по которым обрабатывается строка и приводит к другому выходу изNumberStyles.Number
(правила по умолчанию используетсяdecimal.Parse
).например, следующий код будет генерировать
FormatException
в моей машине:CultureInfo culture = new CultureInfo(""); culture.NumberFormat.NumberDecimalDigits = 2; culture.NumberFormat.NumberDecimalSeparator = "."; culture.NumberFormat.NumberGroupSeparator = ","; Decimal.Parse("1,234.5", NumberStyles.Float, culture); // FormatException thrown here
Я бы рекомендовал использовать вход
NumberStyles.Number | NumberStyles.AllowExponent
, так как это позволит экспоненциальные числа и все равно будет обрабатывать строку подdecimal
правила.CultureInfo culture = new CultureInfo(""); culture.NumberFormat.NumberDecimalDigits = 2; culture.NumberFormat.NumberDecimalSeparator = "."; culture.NumberFormat.NumberGroupSeparator = ","; Decimal.Parse("1,234.5",NumberStyles.Number | NumberStyles.AllowExponent, culture); // Does not generate a FormatException
ответить вопрос плаката, правильный ответ должен быть:
decimal x = decimal.Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent); Console.WriteLine(x);
предупреждение об использовании NumberStyles.Любой:
" 6.33 E+03 " преобразуется в 6330, как и ожидалось. В немецком языке десятичные точки представлены запятыми, но 6,33 E+03 преобразуется в 633000! Это проблема для моих клиентов, так как культура, которая генерирует данные, неизвестна и может отличаться от культуры, которая работает с данными. В моем случае у меня всегда есть научная нотация, поэтому я всегда могу заменить запятую на десятичную точку перед разбором, но если вы работаете с произвольной числа, такие как довольно форматированные числа, такие как 1,234,567, тогда этот подход не работает.