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

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

Запись от stpigidy размещена 24.05.2018 в 19:05
Показов 3875 Комментарии 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 вне форума
 
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru