Comments 27
Полезная статья, спасибо.
Жаль, чтоо порой велосипеды настолько «вьехали» в процесс, что перехадить на новые, пусть даже, возможно, более правельные уже не хочется.
Жаль, чтоо порой велосипеды настолько «вьехали» в процесс, что перехадить на новые, пусть даже, возможно, более правельные уже не хочется.
Надо же, этим редактором кто-то всё же пользуется :)
Лучше скажите — есть ли метод перевода string во float, который не только от локали не зависит, но и позволяет указывать символ разделителя десятичной и дробной части?
Ну или хотя бы такой, который может работать одновременно и с '.' и с ','?
Ну или хотя бы такой, который может работать одновременно и с '.' и с ','?
* целой и дробной части
За разделители целой и дробой части отвечает фасет numpunct. Переопределяете его, затем потоковому вводу выводу присваиваете локаль с фасетом numpunct (у потоков тоже есть функция imbue). После чего можно в stringstream писать этим потоком float.
Псеводокод (не обращайте внимание на ошибки — тороплюсь на работу):
Псеводокод (не обращайте внимание на ошибки — тороплюсь на работу):
-
- class numpunct : public numpunct;
- ...
- numpunct* my = new numpunct();
- locale my(locale(""), my).
- stringstream float_sstr;
- float_sstr.imbue(my);
- float_sstr << "1.234";
- string str = float_str.sstr();
-
Разве запись str(«привет, мир») — корректна? Почему не (L«привет, мир»)?
А есть ли в std нынче какой-нибудь аналог кутишного QObject::tr?
Откуда ему там взяться? tr юзает Qt мета-подсистему, ничего подобного в С++ нет, и вряд ли будет. Ибо оно тут не нужно.
Подобные системы хороши не только библиотекой, подменяющей строковые константы, но и средствами вычленения этих констант из кода для последующей обработки переводчиком. STL — это лишь библиотека. Она не содержит никаких утилит, хотя средства интернационализации имеются — это фасет messages. Он позволяет создавать константы-сообщения и предоставляет удобный способ управления ими.
Для интернационализации приложений я использую gettext. То есть не всегда использую, но код пишу так, чтобы подключение gettext или Qt::tr прошло безболезненно. Включаю заголовочный gettext.hpp файл, определяющий макрос _(). поначалу так:
Все сообщения обрамляю этим макросом:
Затем, когда наступает светлый момент и приходится заниматься интернационализацией, делаю изменения в gettext.hpp и в main, прикручивая gettext или Qt в зависимости от потребностей.
Для интернационализации приложений я использую gettext. То есть не всегда использую, но код пишу так, чтобы подключение gettext или Qt::tr прошло безболезненно. Включаю заголовочный gettext.hpp файл, определяющий макрос _(). поначалу так:
-
- #define _(String) (String)
-
Все сообщения обрамляю этим макросом:
-
- std::cout << _("Hello world!") << std::endl;
-
Затем, когда наступает светлый момент и приходится заниматься интернационализацией, делаю изменения в gettext.hpp и в main, прикручивая gettext или Qt в зависимости от потребностей.
[offtopic]Спасибо. Статья дала повод еще раз порадоваться переходу на .NET, с его юникодом на всех уровнях + IFormatter и CultureInfo соответственно.[/offtopic]
[offtopic]Все это не появилось в .NET из ниоткуда… Не стоит, думаю, затрагивать эту тему, а то отклонимся в никому ненужные сравнения теплого с мягким.[/offtopic]
А что мешает использовать юникод в С++?
Как правило наличие унаследованного кода, несовместимого с unicode, в том числе и в RTLях.
Извините, не по теме — а что на камне-то написано, никак не могу разобрать?(
1251? Буээ. Расскажите лучше про Unicode.
Буээ или не буээ, а 8-битные кодировки никто не отменял и нужно уметь с ними работать. Я не разграничивал в этой статье wchar и char. В примере схалявил — писал фасет не как шаблон, а как класс, но это никоим образом не отражается на логике работы фасетов (все они шаблоны, параметризующиеся как wchar-ом так и char-ом). Более того среди неопределенных мною виртуальных функций фасета ctype есть такие как narrow и widen, служащие для обучения программы «сужению» и «расширению» символов. То есть, с помощью них программа-пользователь может налету менять 8-ми битные кодировки на 16-битные и обратно…
Маленькое замечание по примеру. Я забыл подключить locale:
В данном случае ничего страшного — его подключил какой-то другой заголовочный файл, но имейте ввиду…
-
- #include <locale>
-
В данном случае ничего страшного — его подключил какой-то другой заголовочный файл, но имейте ввиду…
Sign up to leave a comment.
Не забываем о языковых и культурных особенностях