Преобразование чисел с экспоненциальной записью из строки в двойное или десятичное число

Есть ли быстрый способ преобразовать числа с экспоненциальной записью (примеры: «0,5e10» или «-5e20») в десятичную или двойную?

Обновление: я нашел разбор числа из экспоненциального Обозначение, но примеры не будут работать для меня, если я не укажу культуру.

Решение:

double test = double.Parse("1.50E-15", CultureInfo.InvariantCulture);

person OMGKurtNilsen    schedule 24.10.2011    source источник
comment
Вы можете использовать следующее: msdn.microsoft.com/en- us/library/system.math.exp.aspx   -  person Security Hound    schedule 24.10.2011
comment
@Ramhound: это не идеально по ряду причин; не говоря уже о том, что он использует дорогостоящие операции с плавающей запятой, излишне запутан и предназначен для гораздо более общей операции x ^ y, где x и y являются действительными числами.   -  person Noldorin    schedule 24.10.2011
comment
Вы пробовали использовать double.TryParse и decimal.TryParse?   -  person Emmanuel N    schedule 24.10.2011


Ответы (4)


Если ваша культура использует . в качестве десятичного разделителя, подойдет только double.Parse("1.50E-15").

Если ваша культура использует что-то другое (например, ,) или вы хотите, чтобы ваше приложение работало одинаково на всех компьютерах, вам следует использовать InvariantCulture:

double.Parse("1.50E-15", CultureInfo.InvariantCulture)
person svick    schedule 24.10.2011
comment
Уже понял это, но это был первый рабочий ответ. - person OMGKurtNilsen; 24.10.2011
comment
Да, я заметил. В следующий раз вы должны опубликовать решение как ответ, а не редактировать вопрос. - person svick; 24.10.2011

Стандартный double.Parse или decimal.Parse.

Примеры:

// AllowExponent is implicit
var number1 = double.Parse("0.5e10");
Debug.Assert(number1 == 5000000000.0);

// AllowExponent must be given explicitly
var number2 = decimal.Parse("0.5e10", NumberStyles.AllowExponent);
Debug.Assert(number2 == 5000000000m);

Также см. статью MSDN Анализ числовых строк для получения дополнительной информации. Пока для метода Parse указан параметр NumberStyles.AllowExponent (который по умолчанию используется для double), синтаксический анализ таких строк будет работать нормально.

Примечание: как указывает автор вопроса, например, экспоненциальное представление "e10" работает не во всех культурах. Однако указание культуры en-US гарантирует, что она работает. Я подозреваю, что CultureInfo.InvariantCulture тоже должен помочь.

person Noldorin    schedule 24.10.2011
comment
Двойной тест @Dylan = double.Parse(1.509e10, NumberStyles.Float); // Входная строка имела неверный формат. - person OMGKurtNilsen; 24.10.2011
comment
Для decimal.Parse вам необходимо явно указать NumberStyles. - person Noldorin; 24.10.2011
comment
@OMGKurtNilsen: Почему вы явно указываете там NumberStyles? Не нужно. Если вы настаиваете на явном указании, включите также NumberStyles.AllowExponent. - person Noldorin; 24.10.2011
comment
Я думаю, что это не сработает из-за моей культуры. Когда я указал культуру en-US, это сработало. - person OMGKurtNilsen; 24.10.2011
comment
@OMGKurtNilsen: Имеет смысл ... InvariantCulture тоже может сработать. - person Noldorin; 24.10.2011
comment
Это сработало. Отредактирует мое решение. Вы также должны добавить это к своему ответу. - person OMGKurtNilsen; 24.10.2011
comment
@OMGKurtNilsen: Готово. Надеюсь, этого достаточно для принятия сейчас. :-) Та. - person Noldorin; 24.10.2011

@Noldorin верен, попробуйте этот код:

string str = "-5e20";
double d = double.Parse(str);
Console.WriteLine(str);
person Kevin Holditch    schedule 24.10.2011
comment
Спасибо за подтверждение. Это, вероятно, должно быть комментарием, поскольку это просто повторение того, что я сделал. :-) - person Noldorin; 24.10.2011
comment
Я знаю, что изначально добавил как комментарий, но потом понял, что вы не можете поместить блок кода в комментарий - person Kevin Holditch; 24.10.2011
comment
Не беспокойся. В конце концов, не стесняйтесь редактировать мой ответ (у вас есть привилегия у вашего представителя, да?). Если нет, то пример уже есть. Вероятно, мы добавили их одновременно. - person Noldorin; 24.10.2011

Math.Round делает это хорошо, он изменит номер, чтобы удалить, вот как это использовать:

Math.Round(Double.Parse("3,55E-15"),2)
person KARIM Yassine    schedule 23.02.2016