2015-04-04 7 views
2

Проблема: Предположим, вы используете точку "." как десятичный разделитель в вашей региональной настройке и закодировал строку с запятой.Сделать TryParse совместимым с запятой или точкой десятичного разделителя

string str = "2,5";

Что происходит, когда вы decimal.TryParse(str, out somevariable); это?

somevariable будет считать 0.

Что вы можете сделать, чтобы решить эту проблему?

1- Вы можете

decimal.TryParse(str, NumberStyles.Any, CultureInfo.InvariantCulture, out somevariable); 

И вернет 25, а не 2,5, что неверно.

2- Вы можете

decimal.TryParse(str.Replace(",","."), out num); 

И он возвращает правильное значение, НО, если пользователь использует "," в качестве десятичного разделителя не будет работать.

Возможное решение, которое я не могу заставить его работать:

Получить пользователя десятичного разделителя в региональных настройках:

char sepdec = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 

И сделать как-то заменить из ",",sepdec, таким образом было бы остаться запятой если его запятая, и заменить на фактическую точку, если пользователь использует точки.

Подсказки?

Edit: Многие пользователи размещены полезной информация, в последнее время, используя аргументы NumberStyles.Any, CultureInfo.GetCultureInfo("pt-PT") на более tryParse не будет работать, если сепаратор установлен в положении «» Так что довольно много оленьей кожи FULLFILL предпосылки делает TryParse „универсальным“.

Я буду работать вокруг этого, если кто-то имеет больше намеков you'r приветствовать

+5

'2,5' может быть истолковано по-разному в разных странах. Все, что вам нужно, это использовать правильную * CultureInfo * – EZI

+2

Предположим, что значение было 'string str =" 2,500 ";' какое значение это теперь представляет? 2,5 или 2500,0? Невозможно сказать, если вы не знаете культуру, связанную с этим строковым значением. – Alex

+0

Почему вы используете InvariantCulture, когда это определенная культура? –

ответ

0

Я нашел решение, я новичок на этом региональном и запятая точек теме, так что если у вас есть замечания, чтобы улучшить понимание этого пожалуйста добро пожаловать.

Мы начало, получая какой десятичный разделитель пользователь установил в своих региональных вариантов снаружи перед Form{InitializeComponent();} (я хочу универсальную переменную, которая позволит мне исправить код)

char sepdec = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 

В tryParse, чтобы заставить его вести себя повсеместно мы будем читать точки и запятые в строке, и превратить их в десятичный разделитель мы определили как sepdec

decimal.TryParse(str.Replace(",",sepdec.ToString()).Replace(".",sepdec.ToString()), out somevariable); 

Я надеюсь, что это помогает, пожалуйста, комментарий по улучшению sugg estions!

+0

это не будет работать, потому что вы просто заменяете запятую точкой с точкой с точкой снова. Я не думаю, что у вас может быть глобальная версия. но если вы скажете одну US и одну локальную версию, вы можете сделать, как в моем ответе. используйте результат, который tryparse возвращает true – btevfik

+0

, он не работает, потому что 2.500.55 приведет к 2.500.55, который, вероятно, не будет анализировать. – btevfik

+0

Это работает, потому что в моем коде я допускаю, чтобы в текстовые поля помещалась одна точка или одна запятая. Не существует точки и запятой одновременно. У меня будет 2500.55 или 2500.55 соответственно тому, что у пользователя есть разделитель десятичной дроби. Другого выбора нет. Может быть, это потому, что я использую португальские региональные настройки, но хорошо, удача всегда приветствуется;) Также ваш метод не работает в «pt-PT», если я использую разделитель точек. – ng80092b

0

Я знаю, что поток немного старше, но я пытаюсь дать ответ.

Я использую регулярное выражение для определения используемого формата чисел в строке. Регулярное выражение также соответствует номерам без десятичных разделителей («12345»).

var numberString = "1,234.56"; // en 
// var numberString = "1.234,56"; // de 
var cultureInfo = CultureInfo.InvariantCulture; 
// if the first regex matches, the number string is in us culture 
if (Regex.IsMatch(numberString, @"^(:?[\d,]+\.)*\d+$")) 
{ 
    cultureInfo = new CultureInfo("en-US"); 
} 
// if the second regex matches, the number string is in de culture 
else if (Regex.IsMatch(numberString, @"^(:?[\d.]+,)*\d+$")) 
{ 
    cultureInfo = new CultureInfo("de-DE"); 
} 
NumberStyles styles = NumberStyles.Number; 
bool isDouble = double.TryParse(numberString, styles, cultureInfo, out number); 

НТН

Томас

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

  • Нет связанных вопросов^_^