none
Правильный подход при работе с разделителем целой и дробной части RRS feed

  • Вопрос

  • Здравствуйте. Появилась проблемка.  например в textbox вводим значение , умножаем на 3 и выводим результат.

    если ввести 8,3 то все ок.. Если 8.3 то ошибка. Все это дело связано с  тем что стоит в региональных стандартах в пункте разделитель целой и дробной части.Мне то ладно запятую поставлю, а заказчик требует чтобы и с точкой все работало. Можно конечно делать string.replace, но если компонентов textbox, гридов много? везде эти update делать не особо красиво. какой выход сделать?

    Также все время неудобно при запросе к БД любое дробное число заменять с помощью stirng.replace(",",".") (select 1.34 и select 1,34 разница как бы ощутимая :) )

    Отсюда варианты

    1. Читал, где то что можно выставить разделитель целой и дробной части " "." или ","" (тоесть воспринимаются оба)

    2. Сразу в приложении подменять разделитель точкой.ну ладно сменим, а потом при экспорте отчета в excel ни одна формула не заработает(так как разделитель в windows и в моем приложении разный). Тут либо внутри приложения делать разделитель точку а на выходе запятую? но я даже не представляю как это все будет выглядеть. 

    Подскажите как вы обходите эту ошибку?

    16 марта 2014 г. 13:19

Ответы

  • О какой платформе речь? Зная её, было бы удобней приводить примеры. Буду исходить из предположения, что это .NET.

    Во-первых, для ввода чисел никогда не используйте TextBox. Используйте NumericUpDown (компонент WinForms) или аналогичные.

    > заказчик требует чтобы и с точкой все работало

    Шлите заказчика на три буквы. Если будет артачиться, дайте ему ссылку на этот тред, я лично его пошлю.

    В разных культурах приняты разные разделители. И странно использовать те, которых быть не должно. Кроме того, в некоторых культурах могут одновременно использоваться и точка, и запятая в таком формате: 1,234,567.89 - представьте в каких раздумьях будет пользователь, привыкший к такому формату?

    Вывод: культура приложения должна соответствовать культуре пользователя. Если возможна локализация на другие языки - предусмотрите это. Предоставьте пользователю самому выбирать, какую культуру он хочет использовать (где-то в настройках).

    > все время неудобно при запросе к БД любое дробное число заменять с помощью stirng.replace

    Это вообще о чём? Сильно подозреваю, что вы запрос в БД собираете конкатенацией строк. Вон из профессии! Откройте для себя параметры (или используйте ORM).

    > внутри приложения делать разделитель точку а на выходе запятую?

    Внутри приложения нет разделителей вообще! Числа float, double, decimal хранятся в памяти в определённом формате, и знать не знают ни о каких разделителях. Разделители имеют значение лишь при вводе-выводе, то есть при взаимодействии с пользователем. То есть, как я уже сказал вышел, предоставьте пользователю возможность выбора культуры (разделителя).

    Аналогично, при экспорте куда-либо должна быть предусмотрена возможность выбора формата. Ведь и Excel будет ожидать разделители той культуры, которая сейчас выставлена. Однако, серьёзные приложения (такие как Excel) обычно могут принимать разные форматы - их можно задать при импорте данных.

    Если что-то объяснил непонятно, спрашивайте ещё, уточняйте.

    • Помечено в качестве ответа DenisShvatskiy 16 марта 2014 г. 16:32
    16 марта 2014 г. 15:26

Все ответы

  • О какой платформе речь? Зная её, было бы удобней приводить примеры. Буду исходить из предположения, что это .NET.

    Во-первых, для ввода чисел никогда не используйте TextBox. Используйте NumericUpDown (компонент WinForms) или аналогичные.

    > заказчик требует чтобы и с точкой все работало

    Шлите заказчика на три буквы. Если будет артачиться, дайте ему ссылку на этот тред, я лично его пошлю.

    В разных культурах приняты разные разделители. И странно использовать те, которых быть не должно. Кроме того, в некоторых культурах могут одновременно использоваться и точка, и запятая в таком формате: 1,234,567.89 - представьте в каких раздумьях будет пользователь, привыкший к такому формату?

    Вывод: культура приложения должна соответствовать культуре пользователя. Если возможна локализация на другие языки - предусмотрите это. Предоставьте пользователю самому выбирать, какую культуру он хочет использовать (где-то в настройках).

    > все время неудобно при запросе к БД любое дробное число заменять с помощью stirng.replace

    Это вообще о чём? Сильно подозреваю, что вы запрос в БД собираете конкатенацией строк. Вон из профессии! Откройте для себя параметры (или используйте ORM).

    > внутри приложения делать разделитель точку а на выходе запятую?

    Внутри приложения нет разделителей вообще! Числа float, double, decimal хранятся в памяти в определённом формате, и знать не знают ни о каких разделителях. Разделители имеют значение лишь при вводе-выводе, то есть при взаимодействии с пользователем. То есть, как я уже сказал вышел, предоставьте пользователю возможность выбора культуры (разделителя).

    Аналогично, при экспорте куда-либо должна быть предусмотрена возможность выбора формата. Ведь и Excel будет ожидать разделители той культуры, которая сейчас выставлена. Однако, серьёзные приложения (такие как Excel) обычно могут принимать разные форматы - их можно задать при импорте данных.

    Если что-то объяснил непонятно, спрашивайте ещё, уточняйте.

    • Помечено в качестве ответа DenisShvatskiy 16 марта 2014 г. 16:32
    16 марта 2014 г. 15:26
  • NumericUpDown все вопросы решил. его и в грид цеплять можно, как раз. Он принимает только тот разделитель что есть в системе и его и использует, не позволяя другие добавлять. спасибо.

    16 марта 2014 г. 16:32