2013-09-30 4 views
-1

ситуации - Культура нить в моем веб-приложение было установлено на «эс» (испанский)Double.TryParse преобразует 0,1 до 1,0

Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("es"); 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("es"); 

Значение строка «0,1» Для следующего выражения,

var value = "0.1" 
provider = CultureInfo.CreateSpecificCulture("en-US") 
double.TryParse(value.ToString(), NumberStyles.Any, provider, out number) 

номер возвращается 1.0. Это заставляет меня думать, что он собирает информацию о культуре из потока. Не тот, который я предоставляю.

Следующие испытания модулей проходят (как и ожидалось).

var numberInEnUS = "0.1"; 
var spanishCulture = CultureInfo.CreateSpecificCulture("es"); 
culture = new CultureInfo("en-US", false); 
Thread.CurrentThread.CurrentCulture = spanishCulture; 
Thread.CurrentThread.CurrentUICulture = spanishCulture; 
double number; 
double.TryParse(numberInEnUs, NumberStyles.Any, culture, out number); 
Assert.AreEqual(0.1, number); 

Итак, вопрос в том, почему double.TryParse терпят неудачу в моем приложении? Теоретически 0,1 для испанского языка 1 (разделитель для испанский - десятичная точка.). Однако число 1000.0 не преобразуется в 10000. Таким образом, кажется, что он терпит неудачу только для 0,1 Любое объяснение высоко ценится!

+1

Работает отлично для меня –

+1

Культура потока должна быть неактуальной, если вы передаете определенную культуру 'double.TryParse()'. Я заметил, что вы не указали код, в котором вы устанавливаете переменную поставщика; вы на 100% уверены, что отправляете провайдера, которого, по вашему мнению, отправляете? Кстати, лучше использовать «CultureInfo.InvariantCulture», чем «en-US», хотя это не должно иметь никакого значения в вашем случае. –

+1

Wat - это «поставщик», указывающий на? Это самая важная часть, и она отсутствует. –

ответ

0

Наконец-то я смог определить, что не так. Проблема была не в функции TryParse(), а в функции ToString().

Значение было фактически двойным типом, а не строкой, как я упоминал выше. (Плохо, я думал, что это не относится к делу). Я действительно делал value.ToString(). Здесь используется культура потоков и изменяется значение. Итак, если значение равно 0,1, значение. ToString() изменяет его на «0,1». Он автоматически изменяет десятичный символ на основе культуры Thread. Затем TryParse использует культуру en-US и конвертирует «0,1» в 1.

Чтобы исправить это, используйте Convert.ToString и передайте информацию о культуре.

В конце концов, это была просто глупая ошибка.

LessonLearnt - Будьте осторожны при использовании ToString() в глобальных приложениях!

1

Вы говорите, что «0,1» - это номер на испанском языке. На самом деле нет, это numberInEnglish или что-то еще

var numberInSpanish = "0.1";//this is number in english culture 

Это должно быть

var numberInSpanish = "0,1";//<--Note 0,1 

NumberDecimalSeparator для испанского языка ,. Parse 0,1 вы получите ожидаемый результат.

var numberInSpanish = "0,1"; 
var spanishCulture = CultureInfo.CreateSpecificCulture("es"); 
var culture = new CultureInfo("en-US", false); 
Thread.CurrentThread.CurrentCulture = spanishCulture; 
Thread.CurrentThread.CurrentUICulture = spanishCulture; 
double number; 
double.TryParse(numberInSpanish, NumberStyles.Any, spanishCulture, out number); 

Здесь number разобран правильно на "0,1"

0

Ваша проблема заключается в смешении десятичной в и тысячи сепараторов, а именно:

'' - замостить в «эс» культуры, при разборе, будет игнорироваться (например 1.000,0 == 1000,0)

«» - десятичное deparator в „эс“ культуре, разделяет целые и дробные части

Вы можете легко убедить себя:

var spanishCulture = CultureInfo.CreateSpecificCulture("es"); 
    Char dS = spanishCulture.NumberFormat.NumberDecimalSeparator; // <- ',' 
    Char tS = spanishCulture.NumberFormat.NumberGroupSeparator; // <- '.' 

Таким образом, в вашем случае строка «0,1» будет преобразована в 1,0 двойной, так как «» поскольку , являющийся тысячей разделителей в культуре, будет проигнорирован. Вы можете сделать что-либо:

  1. Используйте Инвариантные культуры вместо "эс" один:

    double.TryParse (numberInNeutral, NumberStyles.Any, CultureInfo.InvariantCulture, из числа);

  2. Или использовать фактическое представление Испанский номер:

    вар numberInSpanish = "0,1";

    двойной.TryParse (numberInSpanish, NumberStyles.Any, культура, номер);

+0

Я пытался с InvariantCulture, но все же значение равно 1.0. Кажется, что всегда выбирают культуру нитей. – Zuber

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