Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование STL разных разработчиков, использование use_facet и money_put 
:(
    Опции темы
gorby
Дата 18.2.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Господа, недавно я решил использовать несколько шаблонов из STL. 
Зачем придумывать свое, если есть готовое. 


Код

void writeMoney(ostream& out, long double val, bool intl = false) {

    const money_put<char>& moneyWriter = use_facet<money_put<char> >(out.getloc( ));
    if (moneyWriter.put(out, intl, out, out.fill( ), val).failed( ))
      throw "Couldn't write money!\n";
}

int main(int argc, char * argv[] ) 
{
   long double val2 = 5500055;
   locale locGerm("german");
   cout.setf(ios_base::showbase);
   cout.imbue(locGerm);
   cout << "Euros: ";
   writeMoney(cout, val2 , true);

return 0;
}


И попал в засаду.
На двух платформах разный вывод

Euros: EUR55.000,55     - in Microsoft Visual C++ 2008 (ожидаемый результат)
Euros: 5500055             -- in  MinGW-3.3.1
-----------------------------------------------------
Может быть кто-то сталкивался с чем то подобным.
И как с этим можно бороться.
Спасибо.
PM MAIL WWW Skype   Вверх
jonie
Дата 19.2.2009, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

locale locGerm("german");
чего-то меня смущает это. разве так "по стандарту" ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Dmi3ev
Дата 19.2.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 1
Всего: 41





--------------------

PM MAIL   Вверх
vinter
Дата 19.2.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



по моему эти строки вообще не стандартизированы, но я чаще видел запись типа de_DE, а не german. В любом случае эти строки implementation defined..


--------------------
Мой блог
PM MAIL WWW   Вверх
Dmi3ev
Дата 19.2.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 1
Всего: 41



Цитата

по моему эти строки вообще не стандартизированы, но я чаще видел запись типа de_DE, а не german.

я тоже встречал de_DE.


--------------------

PM MAIL   Вверх
jonie
Дата 19.2.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



http://www.opengroup.org/onlinepubs/009695...xbd_chap08.html
тут пишут вот чего:
Цитата

If the locale value begins with a slash, it shall be interpreted as the pathname of a file that was created in the output format used by the localedef utility; see OUTPUT FILES under localedef. Referencing such a pathname shall result in that locale being used for the indicated category.

[XSI] [Option Start] If the locale value has the form:

    language[_territory][.codeset]

it refers to an implementation-provided locale, where settings of language, territory, and codeset are implementation-defined.

LC_COLLATE , LC_CTYPE , LC_MESSAGES , LC_MONETARY , LC_NUMERIC , and LC_TIME are defined to accept an additional field @ modifier, which allows the user to select a specific instance of localization data within a single category (for example, for selecting the dictionary as opposed to the character ordering of data). The syntax for these environment variables is thus defined as:

    [language[_territory][.codeset][@modifier]]

For example, if a user wanted to interact with the system in French, but required to sort German text files, LANG and LC_COLLATE could be defined as:

    LANG=Fr_FR
    LC_COLLATE=De_DE

так что имхо "german" нифига не по стандарту.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
gorby
Дата 19.2.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Спасибо за оперативный ответ.
Я сейчас проверю, как это работает.
PM MAIL WWW Skype   Вверх
gorby
Дата 19.2.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Попробовал поменять строку    locale locGerm("german");
 на    locale locGerm("De_DE");
---------------------------------------------------
результаты исследования

      Microsoft Visual C++ 2008 
на строке    locale locGerm("De_DE");
получил Unhandled exception 

---------------------------------------------------
 MinGW-3.3.1
результат без изменений
Euros: 5500055             -- in  MinGW-3.3.1
---------------------------------------------------
ps.
Мне нужно добиться правильного (ожидаемого) результата в среде в MinGW-3.3.1

замена De_DE на de_DE ничего не меняет.
PM MAIL WWW Skype   Вверх
bsa
Дата 19.2.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



нужно: "de_DE"
Еще попробуй en_US, может что изменится.
PM   Вверх
vinter
Дата 19.2.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



строки не стандартизированы, хочешь корректного поведения при кроссплатформенности - используй макросы


--------------------
Мой блог
PM MAIL WWW   Вверх
gorby
Дата 20.2.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Цитата(vinter @ 19.2.2009,  18:28)
строки не стандартизированы, хочешь корректного поведения при кроссплатформенности - используй макросы

Спасибо за подсказку.
Прошу Вас чуть подробнее. (Я полагаю, что знаю что такое макросы)
PM MAIL WWW Skype   Вверх
bsa
Дата 20.2.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



gorby
Код
#ifdef _MSC_VER
# define LOCALE_NAME "Russian"
#else
# define LOCALE_NAME "ru_RU"
#endif
...
locale myloc(LOCALE_NAME);
На самом деле все еще сложней. Например, locale("ru_RU") под большинством линуксов работать не будет, так как они хотят получить что-то вроде "ru_RU.UTF-8", более универсальный метод: locale(getenv("LC_NUMERIC")), вот только не уверен в работоспособности под Windows.
PM   Вверх
gorby
Дата 20.2.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: нет



Я прошу прощения, если кого то ввел в заблуждение неточной формулировкой.

Я написал
На двух платформах разный вывод


Но, меня интересует ожидаемый результат на одной платформе. MinGW-3.3.1
MS я использовал только для выяснения причин неправильной работы на MinGW-3.3.1


А для нескольких платформ конечно макросы это самое то.
PM MAIL WWW Skype   Вверх
jonie
Дата 21.2.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



порыл исходники в VS.
нашел вот чего. собственно сам формат локали у майкрософта судя по всему такой: "язык.страна,кодировка" (см setlocal.c функция __lc_strtolc )

далее вызывается функция __get_qualified_locale, которая по указанной структуре (язык,страна,кодировка) получает собсна локаль (в виде трех WORD-ов, упакованных в структуру)...

......

в общем-то есть такая хрень Microsoft Locale Builder.
также я нашел в msdn такую статью: http://msdn.microsoft.com/en-us/library/dd373765(VS.85).aspx

есть еще ISO стандарт на колонку "Script tag" оттуда : http://www.unicode.org/iso15924/iso15924-codes.html


может быть информация будет полезна

Добавлено через 6 минут и 22 секунды
http://msdn.microsoft.com/ru-ru/magazine/cc163506.aspx
еще инфа по стандартам


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.