Двойной анализ с форматом культуры - PullRequest
14 голосов
/ 24 февраля 2011

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

202.667,40

Что составляет 202667.4

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

Ответы [ 7 ]

31 голосов
/ 24 февраля 2011

Сначала вам нужно узнать, из какой культуры этот номер, затем:

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);
10 голосов
/ 08 марта 2011

Я думаю, что нашел решение, которое не требует культуры.Используя 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» приведет к ошибке разбора, поэтому формат должен соответствоватьваш ожидаемый вклад.

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

2 голосов
/ 24 февраля 2011

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

string number = "202.667,40";
double.Parse(number.Replace(".", ""), new CultureInfo(CultureInfo.CurrentCulture.Name) {NumberFormat = new NumberFormatInfo() {NumberDecimalSeparator = ","}});
1 голос
/ 09 апреля 2018
var val=double.Parse( yourValue, CultureInfo.InvariantCulture);

http://www.erikschierboom.com/2014/09/01/numbers-and-culture/

1 голос
/ 17 апреля 2015

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

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

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

1 голос
/ 24 февраля 2011

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

Пример:

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

, затем позже

Double.Parse(your_number, CultureInfo.CurrentCulture);

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

0 голосов
/ 24 февраля 2011
Double.Parse("202.667,40", new System.Globalization.CultureInfo("de-DE"));

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

...