Подтвердить что ты не робот

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

Это сводит меня с ума. У меня есть следующая строка на странице 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. Кто-нибудь?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Когда вы говорите 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.

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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