Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 118

Автор Π”. БтСфСнс

}


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

 // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ фасСт для записи

 const money_put<char>& moneyWriter =

  use_facet<money_put<char> >(out.getloc());

 // Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ. Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ failed() (Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€

 // ostreambuf_iterator), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

 if (moneyWriter.put(out, intl, out, out.fill(), val).failed())

  throw "Couldn't write money!\n";

}


int main() {

 long double val = 0;

 float exchangeRate = 0.775434f; // ΠšΡƒΡ€Ρ Π΄ΠΎΠ»Π»Π°Ρ€Π° ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π΅Π²Ρ€ΠΎ

 locale locEn("english");

 locale locFr("french");

 cout << "Dollars: ";

 cin.imbue(locEn);

 val = readMoney(cin, false);

 cout.imbue(locFr);

 // Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ showbase, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ символ Π²Π°Π»ΡŽΡ‚Ρ‹

 cout.setf(ios_base::showbase);

 cout << "Euros: ";

 writeMoney(cout, val = exchangeRate, true);

}

Если Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 13.6, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Dollars: $100

Euros: EUR77,54

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ЀасСты money_put ΠΈ money_get Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Π΅ значСния Π² ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡ… ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°. Они Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ фасСты Π΄Π°Ρ‚Ρ‹/Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ числовыС фасСты, описанныС Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π°Ρ…. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΈ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для стандартных символов ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° символов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ money_put<char> ΠΈ money_put<wchar_t>. Как ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… фасСтов, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ записи ΠΈ чтСния многословны, Π½ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² ΠΈΡ… нСсколько Ρ€Π°Π·, Π»Π΅Π³ΠΊΠΎ запоминаСшь ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. money_get ΠΈ money_put ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ класс moneypunct, содСрТащий ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ.

Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим запись Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΏΠΎΡ‚ΠΎΠΊ. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠΉ суммы состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… частСй: Π·Π½Π°ΠΊΠ° Π²Π°Π»ΡŽΡ‚Ρ‹, Π·Π½Π°ΠΊΠ° плюс ΠΈΠ»ΠΈ минус, раздСлитСля тысяч ΠΈ дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΈ. ВсС ΠΎΠ½ΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.

Π’Ρ‹ создаСтС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ money_put с Ρ‚ΠΈΠΏΠΎΠΌ символа ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

const money_put<char>& moneyWriter =

 use_facet<money_put<char> >(out.getloc());

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия вСрсий ΠΊΠ°ΠΊ для char, Ρ‚Π°ΠΊ ΠΈ для wchar_t. Π Π°Π·ΡƒΠΌΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСтся запись, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСсогласованности, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° money_put. На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ put для записи Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠ³ΠΎ значСния Π² ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°.

if (moneyWriter.put(out, // Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π²ΠΎΠ΄Π°

 intl,                   // bool: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ intl?

 out,                    // ostream&

 out.fill(),             // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ символ заполнитСля

 val)                    // Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΈΠΏ long double

.failed()) throw "Couldn't write money!\n";

Ѐункция money_put::put записываСт Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π» создан ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ money_put. money_put::put Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ostreambuf_iterator, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π·Π° послСдним Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ символом; этот ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ failed, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ оказываСтся испорчСнным.

ВсС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ money_put::put Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… пояснСний, ΠΊΡ€ΠΎΠΌΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ intl Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅). Он ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ bool ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ символ Π²Π°Π»ΡŽΡ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, $, €) ΠΈΠ»ΠΈ Ρ‚Ρ€Π΅Ρ…Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎΠ΅ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½ΠΎΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π°Π»ΡŽΡ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, USD, EUR). Для использования символа Π²Π°Π»ΡŽΡ‚Ρ‹ установитС Π΅Π³ΠΎ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, Π° для использования ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ обозначСния Π²Π°Π»ΡŽΡ‚Ρ‹ β€” Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true.

ΠŸΡ€ΠΈ записи Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. НиТС описываСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π΅Π³ΠΎ воздСйствиС Π½Π° Π²Ρ‹Π²ΠΎΠ΄ Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠ³ΠΎ значСния.

ios_base::internal

Если ΠΏΡ€ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠ³ΠΎ значСния задаСтся ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈΠ»ΠΈ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ использован символ заполнитСля (Π° Π½Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»). НиТС ΠΏΡ€ΠΈ обсуТдСнии moneypunct приводятся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΏΠΎ шаблонам форматирования.

ios_base::left ΠΈ ios_base::right

Π’Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅Ρ‚ Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ; ΠΏΡ€ΠΈ этом ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ символом заполнитСля (см. описаниС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, width). Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Ρ‚Π°Π±ΡƒΠ»ΡΡ†ΠΈΡŽ Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠ³ΠΎ значСния.

ios_base::width

ЗначСния, Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ money_put, ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‚ΡΡ стандартным ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ управлСния ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ поля ΠΏΠΎΡ‚ΠΎΠΊΠ°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ эти значСния Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²Π»Π΅Π²ΠΎ. Если ΠΏΠΎΠ»Π΅ большС, Ρ‡Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ значСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ символ заполнитСля, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ money_put.

ios_base::showbase

Если этот Ρ„Π»Π°Π³ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ «истина», символ Π²Π°Π»ΡŽΡ‚Ρ‹ выводится, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ Π½Π΅ выводится.

Как я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» Ρ€Π°Π½Π΅Π΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ money_get ΠΈ money_put ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ класс moneypunct, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ фактичСски хранится информация ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Π’Π°ΠΌ Π½Π΅ стоит Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ классС moneypunct, Ссли Π²Ρ‹ Π½Π΅ заняты Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для исслСдования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² форматирования, примСняСмых Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, moneypunct содСрТит Ρ‚Π°ΠΊΠΈΠ΅ свСдСния, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ символ Π²Π°Π»ΡŽΡ‚Ρ‹, символ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² качСствС дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΈ, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Ρ‚.Π΄. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 13.7 прСдставлСна короткая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π°Ρ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 13.7. Π’Ρ‹Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

#include <iostream>

#include <locale>

#include <string>


using namespace std;


string printPattern(moneypunct<char>::pattern& pat) {

 string s(pat.field); // pat.field ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ char[4]

 string r;

 for (int i = 0; i < 4; ++i) {

  switch (s[i]) {

  case moneypunct<char>::sign:

   r += "sign ";

   break;

  case moneypunct<char>::none:

   r += "none ";

   break;

  case moneypunct<char>::space:

   r += "space ";

   break;

  case moneypunct<char>::value:

   r += "value ";

   break:

  case moneypunct<char>::symbol:

   r += "symbol ";

   break;

  }

 }

 return(r);

}


int main() {

 locale loc("danish");

 const moneypunct<char>& punct =

  use_facet<moneypunct<char> >(loc),

 cout << "Decimal point: " << punct.decimal_point() << '\n'

  << "Thousands separator. " << punct.thousands_sep() << '\n'

  << "Currency symbol: " << punct.curr_symbol() << '\n'

  << "Positive sign: " << punct.positive_sign() << '\n'

  << "Negative sign: " << punct.negative_sign() << '\n'

  << "Fractional digits: " << punct.frac_digits() << '\n'

  << "Positive format: "

  << printPattern(punct pos_format()) << '\n'

  << "Negative format: "

  << printPattern(punct.neg_format()) << '\n';

 // Π“Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ символьной строкой, Π½ΠΎ осмыслСнными

 // ΡΠ²Π»ΡΡŽΡ‚ΡΡ числовыС значСния символов, Π° Π½Π΅ собствСнно символы

 string s = punct.grouping();

 for (string::iterator p = s.begin(); p != s.end(); ++p)

  cout << "Groups of: " << (int)*p << '\n';

}

НазначСниС Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² самоочСвидно, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… пояснСний. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΠ΅Ρ‚ΠΎΠ΄ grouping Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку символов, которая интСрпрСтируСтся ΠΊΠ°ΠΊ строка цСлочислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ символ описываСт свою Π³Ρ€ΡƒΠΏΠΏΡƒ Ρ†ΠΈΡ„Ρ€ Π² числС, начиная с ΠΏΡ€Π°Π²ΠΎΠΉ стороны числа. И Ссли Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ строки Π½Π΅Ρ‚ значСния, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, для стандартного амСриканского Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 0 этой строки Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ для Π³Ρ€ΡƒΠΏΠΏΡ‹ с индСксом 0. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π΅Ρ‚, всС Π³Ρ€ΡƒΠΏΠΏΡ‹ с индСксом, большим нуля, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ†ΠΈΡ„Ρ€.

pos_format ΠΈ neg_format Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° moneypunct<T>::pattern, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π»Π΅Π½ field Ρ‚ΠΈΠΏΠ° T[4], Π³Π΄Π΅ T β€” ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт поля field содСрТит ΠΎΠ΄ΠΈΠ½ ΠΈΠ· элСмСнтов пСрСчислСния moneypunct<T>::part, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ: none, space, symbol, sign ΠΈ value. Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²ΠΎΠ΅ прСдставлСниС Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠ³ΠΎ значСния состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… частСй (Ρ‚.Π΅. массив с Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ элСмСнтами) ΠžΠ±Ρ‹Ρ‡Π½ΠΎ части Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠ³ΠΎ значСния ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ symbol space sign value (символ Π²Π°Π»ΡŽΡ‚Ρ‹ ΠΏΡ€ΠΎΠ±Π΅Π» Π·Π½Π°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, значСния $ -32.00. Часто Π·Π½Π°ΠΊ плюс замСняСтся пустой строкой, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Π΅Π· Π·Π½Π°ΠΊΠ° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ рассматриваСтся ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ числа ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСсколько символов, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«()Β», ΠΈ Π² этом случаС ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ выдаСтся Π² части symbol Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ числа (neg_format), Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ символ выдаСтся Π² ΠΊΠΎΠ½Ρ†Π΅, поэтому ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ числа ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΎΠΉ Π²ΠΈΠ΄: $(32.00).