Разбор числа из экспоненциальной нотации


Мне нужно разобрать строку "1.2345 E-02" (Число, выраженное в экспоненциальной нотации) на десятичный тип данных, но Decimal.Parse("1.2345E-02") просто выдает ошибку

7 64

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. Возможно, это связано с производительностью; указание экспоненты относительно редкая, я полагаю.

в дополнение к указанию NumberStyles я бы рекомендовал вам использовать десятичное.TryParse

    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, тогда этот подход не работает.