Double.Parse - проблема интернационализации - PullRequest
18 голосов
/ 06 апреля 2009

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

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. Кто-нибудь?

Ответы [ 6 ]

20 голосов
/ 06 апреля 2009

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

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

10 голосов
/ 20 мая 2010

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

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

(первое сообщение от stackoverflow, так что да, довольно незначительное;)

4 голосов
/ 06 апреля 2009

У вас это задом наперед.

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

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

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

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

3 голосов
/ 06 апреля 2009

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

Точно так же, если вы попросите его в формате в двойном 0,009, вы получите строку "0,009" в es-ES.

2 голосов
/ 06 апреля 2009

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

1 голос
/ 06 апреля 2009
double d = Double.Parse("0,009",
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
    CultureInfo.CreateSpecificCulture("es-ES"));

В культуре es-ES "," - это десятичный разделитель (не ".")

...