Форум программистов, компьютерный форум, киберфорум
stpigidy
Войти
Регистрация
Восстановить пароль

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

Запись от stpigidy размещена 24.05.2018 в 19:05
Показов 3892 Комментарии 10

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

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

C#
1
2
3
4
5
6
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/2018/... -zapyatoj/
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 10
Комментарии
  1. Старый комментарий
    Аватар для Rius
    Как завязывать шнурки?

    Для точки есть double.TryParse() с указанием InvariantCulture.
    Запись от Rius размещена 25.05.2018 в 06:17 Rius вне форума
  2. Старый комментарий
    Тоже вариант. Но лучший ли, ИМХО, зависит от ситуации. В моем случае сам задаешь разделитель и контролируешь процесс.
    Запись от stpigidy размещена 25.05.2018 в 18:34 stpigidy вне форума
  3. Старый комментарий
    Аватар для Rius
    TryParse проверяет, можно ли вообще преобразовать, если нет - возвращает false. А Convert.ToDouble() при невозможности просто выбрасывает исключение.
    В приложении должна быть одна культура, известная пользователю. Это культура всего интерфейса. Указывать формат отдельно разделителя ни к чему.
    Именно точка используется при сохранении данных в файлы и документы для последующего считывания на этой или иной машине. В этом случае применяют именно инвариантную культуру с точкой в качестве разделителя.
    Запись от Rius размещена 25.05.2018 в 18:39 Rius вне форума
  4. Старый комментарий
    Цитата Сообщение от Rius
    TryParse проверяет, можно ли вообще преобразовать, если нет - возвращает false.
    Вот в этом моменте, меня учили, что это сишный подход. В C# принято проверять исключения (может меня неправильно учили). В остальном - благодарю за комментарий.
    Запись от stpigidy размещена 26.05.2018 в 16:02 stpigidy вне форума
  5. Старый комментарий
    Аватар для Avazart
    В приложении должна быть одна культура, известная пользователю. Это культура всего интерфейса. Указывать формат отдельно разделителя ни к чему.
    Это не так. В интерфейс программы может быть один(например русский), а данные она может получать с сайта где другая локаль (например английская).

    Касательно коды возврата vs исключения, тут по ситуации.
    Например исключения удобны когда можно с группировать код в один блок.
    Запись от Avazart размещена 26.05.2018 в 21:42 Avazart вне форума
  6. Старый комментарий
    Аватар для Rius
    Это не так. В интерфейс программы может быть один(например русский), а данные она может получать с сайта где другая локаль (например английская).
    Так. Один язык - интерфейса пользователя. Другой - язык обмена, который принято делать английским. О чём я выше написал.
    Запись от Rius размещена 26.05.2018 в 22:41 Rius вне форума
  7. Старый комментарий
    вообще - в современном программировании, всякая "культурозависимость" это адское д..нище, способствующее только появлению на ровном месте быдло- и г-кода! Хорошо б принять такой стандарт, где разделитель для дробной части всегда один и тот же, а в char'е всегда 1 байт!

    Тьфу, накипело.
    Запись от stpigidy размещена 30.05.2018 в 16:25 stpigidy вне форума
  8. Старый комментарий
    Сделали же так с метрической системой! А то до сих пор бы занимались церебральным сексом, переводя пуды в фунты! Так что вообще поддержка "культуры", это гадость, "культура" должна умереть как класс (а так же как тип, объект, переменная и константа).

    (продолжаю кипеть, но уже по другому поводу)
    Запись от stpigidy размещена 30.05.2018 в 16:32 stpigidy вне форума
  9. Старый комментарий
    Аватар для Rius
    Пишите только на английском и только для англоязычных пользователей. Тогда всех этих проблем не будет.
    Запись от Rius размещена 30.05.2018 в 17:51 Rius вне форума
  10. Старый комментарий
    Аватар для Avazart
    "Больше всего ненавижу две вещи расизм и негров ... "
    Запись от Avazart размещена 30.05.2018 в 18:58 Avazart вне форума
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru