2009-04-06 2 views
17

Это сводит меня с ума. У меня есть следующая строка в ASP.NET 2.0 WebForm. Простой достаточно. Теперь, если моя культура является испанской - что «эс-ES» - и я стараюсь, чтобы преобразовать строку в Double, я следующее:Double.Parse - проблема интернационализации

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

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

Если я

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

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

+1

Более подробную информацию об этом и многие другие проблемы с локализацией, например, на http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html –

ответ

20

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

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

+0

да, я все понял неправильно. Спасибо, ребята, за ответы. Это было действительно полезно. –

+0

Нет проблем. Я всегда рад помочь. Извините, если мой ответ натолкнулся на немного резкий - он не был предназначен таким образом, но перечитал его сейчас, он читается, как будто я прав. –

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.

2

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

3

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

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

1
double d = Double.Parse("0,009", 
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, 
    CultureInfo.CreateSpecificCulture("es-ES")); 

В эс-ES культуры "" десятичное seporator (не "")

10

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

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

(первый StackOverflow пост, так что да, а маргинальный;)

Смежные вопросы