Все, кто когда-либо писали программы на C#, использовали такую простую функцию как
Convert.ToDouble(string value);
у меня, как и у остальных, до определенного момента никаких проблем с ней не возникало. У этой функции есть такая особенность, которая не всем известна — это то, что разделитель по умолчанию используется тот, который стоит в системе.
В англоязычных странах в качестве разделителя используется точка, а в остальных странах, преимущественно, запятая. Всё в принципе, не плохо, и среда .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);
и проблема решена, не зависимо от того, какой знак используется системой, заменив в строке запятую на этот знак — получим подходящий формат для преобразования.
Что бы изменить разделитель в системе заходим сюда:
Надеюсь, вы никогда не забудете об этом нюансе, в случае работы на иностранного заказчика. И это поможет сохранить некоторое время.
Автор: belkamax05