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

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

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 13.3. Π―Π²Π½ΠΎΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ

#include <iostream>

#include <fstream>

#include <locale>

#include <string>


using namespace std;


int main() {

 try {

  locale loc("");

  cout << "Locale name = " << loc.name() << endl;

  locale locFr("french");

  locale locEn("english-american");

  locale locBr("portuguese-brazilian");

  cout.imbue(locFr); // Π£Π²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ cout ΠΎ нСобходимости примСнСния

                     // французского форматирования

  cout << "3.14 (French) = " << 3.14 << endl;

  cout << "Name = " << locFr.name() << endl;

  cout.imbue(locEn); // Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° английский (амСриканский

                     // Π²Π°Ρ€ΠΈΠ°Π½Ρ‚)

  cout << "3.14 (English) = " << 3.14 << endl;

  cout << "Name = " << locEn.name() << endl;

  cout.imbue(locBr); // Π£Π²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ cout ΠΎ нСобходимости примСнСния

                     // Π±Ρ€Π°Π·ΠΈΠ»ΡŒΡΠΊΠΎΠ³ΠΎ форматирования

  cout << "3.14 (Brazil) = " << 3.14 << endl;

  cout << "Name = " << locBr.name() << endl;

 } catch (runtime_error& e) {

  // Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ имя Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, выбрасываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

  // runtime_error.

  cerr << "Error: " << e.what() << endl;

 }

}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² систСмС Windows ΠΏΡ€ΠΈ использовании Visual C++ 7.1 выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Locale name = English_United States.1252

3.14 (French) = 3,14

Name = French_France.1252

3.14 (English) = 3.14

Name = English_United States.1252

3.14 (Brazil) = 3,14

Name = Portuguese_Brazil.1252

ΠžΡ‚ΡΡŽΠ΄Π° Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ моя машина Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π½Π° амСриканский Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ английского языка с использованиСм ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ страницы 1252. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ выводится число Β«ΠΏΠΈΒ» ΠΏΡ€ΠΈ использовании Π΄Π²ΡƒΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²ΠΎ французском ΠΈ Π±Ρ€Π°Π·ΠΈΠ»ΡŒΡΠΊΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… примСняСтся запятая вмСсто дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΈ. Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ тысяч Ρ‚ΠΎΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ: Π²ΠΎ французском ΠΈ ΠΏΠΎΡ€Ρ‚ΡƒΠ³Π°Π»ΡŒΡΠΊΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΠ±Π΅Π» вмСсто запятой, поэтому число 1,000,000.25, прСдставлСнноС Π² амСриканском Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ‹ Π²ΠΈΠ΄ 1 000 000,25 Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ французской ΠΈ ΠΏΠΎΡ€Ρ‚ΡƒΠ³Π°Π»ΡŒΡΠΊΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв всС ΠΆΠ΅ Π½Π΅ стоит ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, явно задавая ΠΈΡ… ΠΈΠΌΠ΅Π½Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ чисСл, Π΄Π°Ρ‚, Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… ΠΈ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, просто достаточно ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡƒΡΡ‚ΡƒΡŽ строку ΠΈ закрСпляя Π΅Π΅ Π·Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

ΠŸΡ€Π°Π²ΠΈΠ»Π° примСнСния Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ, поэтому я ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΈΠ·Π»ΠΎΠΆΡƒ основныС ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹.

β€’ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ глобальная локализация являСтся Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Β«Π‘Β», ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ стандартом гарантируСтся сущСствованиС Π² любой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этой Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

β€’ Π’сС стандартныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ глобальной Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ этой Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ являСтся локализация Β«Π‘Β».

β€’ ΠšΠΎΠΏΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, пСрСдавая ΠΏΡƒΡΡ‚ΡƒΡŽ строку конструктору locale, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ locale("").

β€’ ΠžΠ±ΡŠΠ΅ΠΊΡ‚ locale для ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, пСрСдавая строку, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ locale("portuguese-brazilian"). Однако эти строки Π½Π΅ стандартизованы.

β€’ ΠŸΠΎΡΠ»Π΅ получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° locale, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ locale::global. ВсС создаваСмыС послС этого ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

β€’ Π”ля ΠΏΠΎΡ‚ΠΎΠΊΠ° Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ явно ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° imbue.

ΠŸΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ мСстныС особСнности, примСняйтС Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΈΠ΄ΠΈΡ‚. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ссли Π²Π°ΠΌ трСбуСтся ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ число Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΌ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, инстанцируйтС Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚Π΅ Π΅Π΅ Π·Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ число ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΎΡΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Однако, Ссли Π²Ρ‹ записываСтС Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ Π² ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π‘, обСспСчивая ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ. Если ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ измСняСт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ Π΅Π΅ Π·Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π‘. Π’Ρ‹ это ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ двумя способами: создавая Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Β«Π‘Β» ΠΈΠ»ΠΈ вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ locale::classic().

ofstream out("data.dat");

out.imbue(locale::classic());

out << pi << endl; // Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π‘

Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ числа Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ. НапримСр, для чтСния числа с использованиСм французской Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ записи Π΅Π³ΠΎ с использованиСм Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π‘ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.

double d;

cin.imbue(locale("french"));

cin >> d;

cout << "In English: " << d;

Если Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π²Π²Π΅Π΄Π΅Ρ‚Π΅ 300,00, ΠΎΠ½Π° распСчатаСт 300.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊ подчинялся мСстным соглашСниям ΠΏΠΎ Π²Ρ‹Π²ΠΎΠ΄Ρƒ чисСл, явно Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚Π΅ Π·Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ locale Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ imbue. Если трСбуСтся Π²ΠΎ всСх созданных ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, сдСлайтС Π΅Π΅ глобальной. ЗначСния Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ; см. Ρ€Π΅Ρ†Π΅ΠΏΡ‚ 13.4, Π³Π΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Π΅ значСния.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚ 13.4.

13.3. Π—Π°ΠΏΠΈΡΡŒ ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Ρ‚ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

ВрСбуСтся ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ значСния Π΄Π°Ρ‚ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ мСстныС соглашСния ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ.

РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΈΠΏ time_t ΠΈ tm struct ΠΈΠ· <ctime>, Π° Ρ‚Π°ΠΊΠΆΠ΅ фасСты Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, прСдусмотрСнныС Π² <locale>, для записи ΠΈ чтСния Π΄Π°Ρ‚ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ (фасСты вскорС Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны ΠΏΡ€ΠΈ обсуТдСнии ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°). Π‘ΠΌ. ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 13.4.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 13.4. Π—Π°ΠΏΠΈΡΡŒ ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Ρ‚

#include <iostream>

#include <ctime>

#include <locale>

#include <sstream>

#include <iterator>


using namespace std;


void translateDate(istream& in, ostream& out) {

 // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π΄Π°Ρ‚Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

 const time get<char>& dateReader =

  use_facet<time_get<char> >(in.getloc());


 // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ состояния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ использован фасСтом для

 // увСдомлСния нас ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

 ios_base::iostate state = 0;

 // ΠœΠ°Ρ€ΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ†Π°

 istreambuf_iterator<char> end;

 tm t; // Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° для прСдставлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (ΠΈΠ· <ctime>)


 // Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° всС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ΠΎ, ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρƒ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°

 // ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ Π² структуру Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

 dateReader.get_date(in, end, in, state, &t);


 // Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄Π°Ρ‚Π° находится Π² структурС tm. ВывСсти Π΅Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ,

 // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ выводятся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ

 // достовСрныС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· t.

 if (state == 0 || state == ios_base::eofbit) { // Π§Ρ‚Π΅Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

  const Time_put<char>& dateWriter =

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

  char fmt[] = "%x";

  if (dateWriter.put{out, out, out.fill(),

   &t, &fmt[0], &fmt[2]).failed())

   cerr << "Unable to write to output stream.\n";

 } else {

  cerr << "Unable to read cin!\n";

 }

}


int main() {

 cin.imbue(locale("english"));

 cout.imbue(locale("german"));

 translateDate(cin, cout);

}

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

3/28/2005

28.03.2005

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

Для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ записи ΠΈ чтСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° класса locale. ΠŸΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² эту Π³Π»Π°Π²Ρƒ, Ссли Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с концСпциями Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈ фасСтов.

Π’ C++ Π½Π΅Ρ‚ стандартного класса для прСдставлСния Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящими для этого Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ time_t ΠΈ структура tm ΠΈΠ· <ctime>. Если трСбуСтся Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρ‹ с использованиСм срСдств стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π²Π°ΠΌ придСтся любоС нСстандартноС прСдставлСниС Π΄Π°Ρ‚Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π² структуру tm. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π²Π°ΠΌΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, вСроятно, ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ форматирования Π΄Π°Ρ‚ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ мСстных особСнностСй.

Π Π°Π½Π΅Π΅ я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Ρ‡Ρ‚ΠΎ фасСт опрСдСляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ аспСкт Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ Π΅Π΅ особСнности. Π‘ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ, фасСт β€” это константная инстанциация шаблона класса символьного Ρ‚ΠΈΠΏΠ°, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ зависит ΠΎΡ‚ класса Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΈ конструировании. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 13.4 я ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ создаю экзСмпляр фасСта time_get.

const time_get<char*>& dateReader =

 use_facet<time_get<char> >(in.getloc());

Π¨Π°Π±Π»ΠΎΠ½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ use_facet Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ фасСт для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ВсС стандартныС фасСты ΡΠ²Π»ΡΡŽΡ‚ΡΡ шаблонами классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ символьного Ρ‚ΠΈΠΏΠ°, ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ мною ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ символы Ρ‚ΠΈΠΏΠ° char, я ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΡƒΡŽ ΠΌΠΎΠΉ класс time_get для char. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ рСализация обСспСчивала ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ шаблона для char ΠΈ wchar_t, поэтому ΠΎΠ½ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ (хотя Π½Π΅ гарантируСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π‘). Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ мною ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ time_get ΠΈΠΌΠ΅Π΅Ρ‚ спСцификатор const, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ прСдусмотрСнная Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ это Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ» форматирования Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π°Π·Π½Ρ‹Ρ… локализациях, ΠΈ эти ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, поэтому состояниС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ фасСта Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, Π³Π΄Π΅ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.