Двойной.Проблема синтаксического анализа - интернационализации

StackOverflow https://stackoverflow.com/questions/721950

Вопрос

Это сводит меня с ума.У меня есть следующие строки в разделе 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 является запятой, но разве он не должен использовать информацию о культуре, которую я передаю методу parse, и применить правильный формат к преобразованию?

Если я это сделаю

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

У вас все наоборот.

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

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

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

Я предполагаю, что вы хотите использовать Double.Выполните синтаксический анализ с использованием инвариантной культуры, а toString - с испанской культурой, так что 0.009 станет 0.009.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top