Как стать автором
Обновить

Комментарии 14

Вообще, это больше похоже на дырку в стандарте. Интересно, что в нём написано по этому поводу.
Вы уже забросили жука на bugreports.qt.io?
а кьют тут причем? Вроде в контексте STL статья
Не уверен, что в QCoreApplication это именно баг, тем более, что про использование setlocale() сказано в его документации.

С другой стороны, на мой взгляд правильнее было бы вместо setlocale() использовать std::locale::global(). Тогда бы не было проблемы, описанной мной в статье. Гляну у них в багрепорте по этому поводу, спасибо. Может кто уже предлагал.

Откуда кстати вообще взялся этот бред что в качестве разделителя некоторые используют запятую?

И месяц вперед дня пишут. А год после.
Национальные стандарты (привычки) как правило. Если посмотреть особенности locale доступных в системе можно обнаружить много интересного.
К примеру, недавно пришлось менять свойство локали выдающей дату, потому как преобразование даты как упоминалось выше шло неверно: 20.01.00 а нужно было 2000.01.20.
Ещё сталкивались с количеством нулей вывводимых после запятой для дробных чисел, так же настраивается в locale.
Кто-то привык со времён пиратской английской виндовс, многие из них ещё Чикаго помнят.
Кому-то всё равно.
В одной как-бы госструктуре, лет 10 назад, при ежемесячных обновлениях, регулярно меняли разделители… точка, запятая, таб, точка с запятой… и каждый раз при обновление они конавертировали БД.
а мне sprintf почему то нравится для этих целей.

sscanf. sprintf — это из числа в строку.

Еще забавные грабли с локалью
std::ifstream(name); // может не открыть если в путях неудачные символы
fopen(name,«rb»); // открывает тот же файл

И еще такой вопрос: как менять локаль для отдельного потока?
Да, наталкивался на подобную проблему.
У меня правда был atoi, который должен пропускать пробельные символы в начале. И был там в начале не просто пробел, неразрывный пробел он же nbsp. Так вот в 1251 локали atoi неразрывный пробел понимает, а в C-локали не понимает. Но я это узнал уже после нескольких кругов ада при выяснении — почему на windows работает, а на linux нет. А потому что на linux была честная C локаль, а на windows подключена libdjvu, которая меняла локаль при старте.
К чему я это все:
Вводят наконец то не зависимые от локали преобразователи std::from_chars
Спасибо за наводку. Теперь С++17 я жду с еще большим нетерпением!
А вот еще интересная задачка, с которой я когда-то столкнулся — как ввести десятичную дробь и узнать число цифр после запятой, то есть точность этого числа?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории