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

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

Запись от stpigidy размещена 24.05.2018 в 19:05
Обновил(-а) stpigidy 24.05.2018 в 19:09 (нифигасе тут теги странно работают)

Напоролся на тривиальный, но неприятный подводный камень. Функция 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/
Размещено в Без категории
Просмотров 663 Комментарии 10
Всего комментариев 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 на форуме
    Обновил(-а) Avazart 26.05.2018 в 21:44
  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 на форуме
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.