Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
C# Про конвертирование строки в Double (или любой другой тип с плавающей запятой)

Напоролся на тривиальный, но неприятный подводный камень. Функция Convert.ToDouble() по умолчанию смотрит на разделитель целой и дробной части, который указан в системных настройках. И если в строке разделитель другой, то генерирует exception, например, если конвертировать число 3.14, а в системных настройках в качестве разделителя указана не . (точка), а , (запятая), то программа вывалится с ошибкой.

Решение простое, с помощью второго параметра функции Convert.ToDouble() задать разделитель целой и дробной части. Вот пример функции-обертки над Convert.ToDouble(), с возможностью указания разделителя:

public static double ConvertToDouble(string Value, string DecimalSeparator)
        {
            NumberFormatInfo format = new NumberFormatInfo();
            format.NumberDecimalSeparator=DecimalSeparator;
            return Convert.ToDouble(Value, format);
        }


На самом деле, с помощью NumberFormatInfo можно задать еще кучу параметров, например, разделитель разрядов, буде такой понадобится.

Код на PasteBin

Источник


MSDN

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2018/05/04/c-pro-konvertirovanie-stroki-v-double-ili-lyuboj-drugoj-tip-s-plavayushhej-zapyatoj/

Tags: ,
Comments

Тоже вариант, но это просто такая типа заметка, описывающая именно саму проблему. Понятно, если число может прийти как "3.14" или как "3,14" или как "3 14" или как "3#14", то проще этот зоопарк заменить сначала на что-нибудь одно, не зависящее от системных настроек, а потом сконвертировать, жестко задав разделитель.

Дык, твоя заметка именно что описывает проблему, а не решает её.

Просто сам натыкался на подобное, когда писал анализатор CAD-файлов. Олдфаги используют английский интерфейс CAD, и дробные у них с точкой. Молодёжь сидит на русском, и дробные с запятой. Сам анализатор может быть запущен как на русской, так и на английской винде. Так что жёстко заданный разделитель тут единственный вариант.