Pull to refresh

То, что нужно помнить о десятичном разделителе

Reading time 2 min
Views 41K
Все, кто когда-либо писали программы на C#, использовали такую простую функцию как
Convert.ToDouble(string value);
у меня, как и у остальных, до определенного момента никаких проблем с ней не возникало. У этой функции есть такая особенность, которая не всем известна — это то, что разделитель по умолчанию используется тот, который стоит в системе.
image


image

В англоязычных странах в качестве разделителя используется точка, а в остальных странах, преимущественно, запятая. Всё в принципе, не плохо, и среда .Net, как и большинство современных программ знают, какой именно разделитель используется системой. Но такая программа, как Meta Trader была написана русскими программистами, которые о разделителе как-раз таки не знали, и программа всегда использует по умолчанию запятую. Нужно было реализовать передачу с MT4 на приложение данных и обратно через сокеты. Во время тестирования у себя на компьютере странного поведения замечено не было, т.к. у меня в системе стоит по умолчанию ",". Но программа писалась для иностранного заказчика, у которого по идее всё должно было работать точно также. Непонятно по какой причине, данные, принимаемые моей программой, при переводе из строки в Double обрабатывались не правильно и без всяких исключений. Например, преобразование из строки «1,4174» в число у меня на компьютере давало такой же результат, в то время как у заказчика «1,4174» давало результат 14174, то есть пятизначное число без всяких разделителей, которое было замечено не сразу.

Решение, в отличие от самой ошибки было найдено моментально – заменить запятую, на знак, используемый системой.

Строки:

String Source = "0,05";
Double number = Convert.ToDouble(Source);

вызывают FormatException в случае если разделителем в системе выступает точка.

Заменяем их на

Char separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator[0];
String Source = "0,05".Replace( ',' , separator);
Double number = Convert.ToDouble(Source);

и проблема решена, не зависимо от того, какой знак используется системой, заменив в строке запятую на этот знак — получим подходящий формат для преобразования.


Что бы изменить разделитель в системе заходим сюда:
image
image
image

Надеюсь, вы никогда не забудете об этом нюансе, в случае работы на иностранного заказчика. И это поможет сохранить некоторое время.
Tags:
Hubs:
-3
Comments 43
Comments Comments 43

Articles