Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > использование STL разных разработчиков


Автор: gorby 18.2.2009, 19:32
Господа, недавно я решил использовать несколько шаблонов из 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
-----------------------------------------------------
Может быть кто-то сталкивался с чем то подобным.
И как с этим можно бороться.
Спасибо.

Автор: jonie 19.2.2009, 09:09
Цитата

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

Автор: Dmi3ev 19.2.2009, 09:59
http://www2.roguewave.com/products/whitepapers.cfm?paper=spcint2
http://msdn.microsoft.com/en-us/library/aa479681.aspx
http://www.cantrip.org/locale.html
http://www.tacc.utexas.edu/services/userguides/pgi/pgC++_lib/stdlibug/sta_9169.htm

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

Автор: Dmi3ev 19.2.2009, 10:21
Цитата

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

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

Автор: jonie 19.2.2009, 10:47
http://www.opengroup.org/onlinepubs/009695399/basedefs/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" нифига не по стандарту.

Автор: gorby 19.2.2009, 12:22
Спасибо за оперативный ответ.
Я сейчас проверю, как это работает.

Автор: gorby 19.2.2009, 14:14
Попробовал поменять строку    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 ничего не меняет.

Автор: bsa 19.2.2009, 17:45
нужно: "de_DE"
Еще попробуй en_US, может что изменится.

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

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

Спасибо за подсказку.
Прошу Вас чуть подробнее. (Я полагаю, что знаю что такое макросы)

Автор: bsa 20.2.2009, 15:19
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.

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

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


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


А для нескольких платформ конечно макросы это самое то.

Автор: jonie 21.2.2009, 11:14
порыл исходники в 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
еще инфа по стандартам

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)