Толик Панков
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, и дробные у них с точкой. Молодёжь сидит на русском, и дробные с запятой. Сам анализатор может быть запущен как на русской, так и на английской винде. Так что жёстко заданный разделитель тут единственный вариант.