Двойной анализ с форматом культуры

У меня есть двойное число как строка. Число

202.667,40

Что такое 202667.4

Как я могу разобрать эту строку, чтобы получить значение типа: Double.Parse( "202.667,40", "что здесь" ) или любой другой метод для получения значения. Благодаря

Ответ 1

Во-первых, вам нужно знать, в какой культуре это число, а затем:

CultureInfo culture = new CultureInfo("de"); // I'm assuming german here.
double number = Double.Parse("202.667,40", culture);

Если вы хотите проанализировать использование текущей культуры потоков, которая по умолчанию является той, которая установлена ​​для текущего пользователя:

double number = Double.Parse("202.667,40", CultureInfo.CurrentCulture);

Ответ 2

Я думаю, что нашел решение, которое не требует культуры. Используя NumberFormatInfo, вы можете форсировать формат независимо от культуры:

// This is invariant
NumberFormatInfo format = new NumberFormatInfo();
// Set the 'splitter' for thousands
format.NumberGroupSeparator = ".";
// Set the decimal seperator
format.NumberDecimalSeparator = ",";

Затем позже:

System.Diagnostics.Debug.WriteLine(double.Parse("202.667,40", format)));

Выходы:
202667,4

Конечно, этот вывод (внутренний toString()) может отличаться в зависимости от культуры (!)
Обратите внимание, что изменение ввода на "202,667.40" приведет к ошибке синтаксического анализа, поэтому формат должен соответствовать ожидаемому входу.

Надеюсь, это поможет кому-то.

Ответ 3

Для большей гибкости вы можете установить NumberDecimalSeparator

string number = "202.667,40";
double.Parse(number.Replace(".", ""), new CultureInfo(CultureInfo.CurrentCulture.Name) {NumberFormat = new NumberFormatInfo() {NumberDecimalSeparator = ","}});

Ответ 4

Вы можете использовать Double.Parse(your_number, CultureInfo.CurrentCulture) и установить CurrentCulture соответственно с помощью Thread.CurrentThread.CurrentCulture.

Пример:

Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");

а затем

Double.Parse(your_number, CultureInfo.CurrentCulture);

Обратите внимание, что если вы явно назначаете культуру CurrentThread, она применима только к этому потоку.

Ответ 5

Вместо того, чтобы указывать локаль во всех синтаксических разборах, я предпочитаю устанавливать локальную область приложения, хотя, если строковые форматы не являются согласованными в приложении, это может не сработать.

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("pt-PT");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("pt-PT");

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

Ответ 7

Double.Parse("202.667,40", new System.Globalization.CultureInfo("de-DE"));

Вместо de-DE использовать любую культуру, в которой находится строка.