Double.Parse - проблема интернационализации

18

Это сводит меня с ума. У меня есть следующая строка на странице ASP.NET 2.0 WebForm

string s = "0.009";

Прост достаточно. Теперь, если моя культура испанская - это «es-ES» - и я пытаюсь преобразовать строку в Double, я делаю следующее:

double d = Double.Parse(s, new CultureInfo("es-ES"));

то, что я ожидаю, равно 0,009. Вместо этого я получаю 9. Я понимаю, что .NET считает, что это тысячный разделитель, который в en-US является запятой, но не должен ли он принимать информацию о культуре, которую я передаю методу анализа и применяю правильный формат для преобразование?

Если я делаю

double d = 0.009D;
string formatted = d.ToString(new CultureInfo("es-ES"));

отформатировано теперь 0,009. Кто-нибудь?

    
задан oz. 06.04.2009 в 17:22
источник
  • Подробнее об этом и многих других проблемах с локализацией, например, в moserware.com/2008/02/does-your-code-pass-turkey-test.html –  Jeff Moser 19.05.2010 в 23:40

6 ответов

20

Он принимает культуру, которую вы дали, и применяя правильное форматирование. Вы предоставили строку «0.009» и сказали, что это испанский ... тогда вы жалуетесь, что правильно интерпретировали ее как испанский! Не говорите, что строка является испанской, когда вы знаете, что это не так.

Вы должны передать методу Parse культуру обрабатываемой строки, которая в этом случае будет en-US или en-Gb или InvariantCulture.

    
ответ дан Jeff Yates 06.04.2009 в 17:26
источник
  • да, я все понял неправильно. Спасибо, ребята, за ответы. Это было действительно полезно. –  oz. 06.04.2009 в 17:32
  • Нет проблем. Я всегда рад помочь. Извините, если мой ответ натолкнулся на немного резкий - он не был предназначен таким образом, но перечитал его сейчас, он читается, как будто я прав. –  Jeff Yates 06.04.2009 в 19:33
10

что пишет Джесс для меня. просто для тех, кому нужно попробовать, как получить «инвариантную культуру»: это выглядит так:

double d = Double.Parse(myString, CultureInfo.InvariantCulture);

(первый postoverflow post, поэтому да, довольно маргинальный;)

    
ответ дан Nicolas78 19.05.2010 в 23:25
источник
4

У вас есть это назад.

Когда вы говорите double d = Double.Parse(s, new CultureInfo("es-ES")); , вы просите .NET проанализировать вашу строку в double, считая, что строка написана в культуре es-ES.

В испанской культуре "." является разделителем тысяч, поэтому «0.009» равно 9.

Когда вы конвертируете с помощью ToString (), в конце, он говорит, что конвертирует 0.009 в строку, используя испанскую культуру, поэтому он использует «,» как разделитель десятичных чисел, и вы получаете «0,009». Поведение правильное.

Я предполагаю, что вы хотите использовать Double.Parse с инвариантной культурой и ToString с испанской культурой, поэтому 0.009 становится 0,009.

    
ответ дан Reed Copsey 06.04.2009 в 17:26
источник
3

Я думаю, что вы интерпретируете это неправильно, в ES-ES-культуре 0,009 действительно просто длинный способ сказать 9, как «.». не является десятичным разделителем, поэтому, если вы попросите <0,009> проанализировать с помощью культуры es-ES, вы действительно должны получить deouble 9.0. Если вы попросите его разобрать «0,009», вы должны получить двойную цифру 0,009.

Аналогично, если вы запросите его format в double 0.009, вы должны получить строку «0,009» в es-ES.

    
ответ дан Steve Haigh 06.04.2009 в 17:29
источник
2

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

    
ответ дан Joel Coehoorn 06.04.2009 в 17:27
источник
1
double d = Double.Parse("0,009",
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
    CultureInfo.CreateSpecificCulture("es-ES"));

В культуре es-ES "," является десятичным seporator (не ".")

    
ответ дан Konstantin Tarkus 06.04.2009 в 17:32
источник