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

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

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

Π Π΅Ρ†Π΅ΠΏΡ‚ 3.2.

3.2. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ чисСл Π² строки

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

Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ числовыС Ρ‚ΠΈΠΏΡ‹ (int, float), ΠΈ Π²Π°ΠΌ трСбуСтся ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… содСрТимоС Π² string, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π².

РСшСниС

Для выполнСния этого имССтся мноТСство способов, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ свои достоинства ΠΈ нСдостатки. ΠŸΠ΅Ρ€Π²Π°Ρ прСдставляСмая ΠΌΠ½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для хранСния строковых Π΄Π°Π½Π½Ρ‹Ρ… класс stringstream, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ прост Π² использовании. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 3.3. Π‘ΠΌΠΎΡ‚Ρ€ΠΈ обсуТдСниС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3.3. Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ числа ΠΊΠ°ΠΊ строки

#include <iostream>

#include <iomanip>

#include <string>

#include <sstream>


using namespace std;


int main() {

 stringstream ss;

 ss << "Π’ ΠΌΠΎΠ΅ΠΉ ΠΊΠΎΡ€Π·ΠΈΠ½Π΅ " << 9 << " яблок.";

 cout<<ss.str() <<endl; //stringstream::str() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ string

                        // с содСрТимым

 ss.str(""); // ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° строки

 ss << showbase << hex << 16; // ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ основаниС Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅

 cout << "ss = " << ss.str() << endl;

 ss.str("");

 ss << 3.14;

 cout << "ss = " << ss.str() << endl;

}

Π’Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 3.3 выглядит Ρ‚Π°ΠΊ.

Π’ ΠΌΠΎΠ΅ΠΉ ΠΊΠΎΡ€Π·ΠΈΠ½Π΅ 9 яблок.

ss = 0x10

ss = 3.14

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

stringstream β€” это ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² string, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС возмоТности форматирования, прСдоставляСмыС классами стандартного Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°. Π’ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 3.3 я для записи ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ тСкста ΠΈ числовых Π΄Π°Π½Π½Ρ‹Ρ… Π² строковый ΠΏΠΎΡ‚ΠΎΠΊ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сдвига Π²Π»Π΅Π²ΠΎ (<<).

ss << "Π’ ΠΌΠΎΠ΅ΠΉ ΠΊΠΎΡ€Π·ΠΈΠ½Π΅ " << 9 << " яблок.";

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ << ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½ для встроСнных Ρ‚ΠΈΠΏΠΎΠ² ΠΈ соотвСтствСнно Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄. Когда трСбуСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π² string, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ str.

cout << ss.str() << endl;

Π’ <iomanip> имССтся большоС количСство манипуляторов ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΈ ΠΈΡ… использованиС ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ числовых Π΄Π°Π½Π½Ρ‹Ρ… Π² строку позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС Π²ΠΈΠ΄Ρ‹ форматирования. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 3.3 для форматирования числа ΠΊΠ°ΠΊ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ я использовал showbase ΠΈ hex, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ возмоТности форматирования. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ отобраТСния, ΠΎΡ‚Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΎΡ‚ числа дСсятичных Π·Π½Π°ΠΊΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ss << setprecision(6) << 3.14285;

Однако использованиС манипуляторов являСтся Π½Π΅ самой ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятной Π²Π΅Ρ‰ΡŒΡŽ, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому создан Ρ€Π΅Ρ†Π΅ΠΏΡ‚, посвящСнный ΠΈΠΌ. Π—Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ числовых Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ манипуляторов ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Ρƒ 10.2.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠ°ΠΊ часто Π±Ρ‹Π²Π°Π΅Ρ‚ Π² Π‘++, имССтся ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Boost Format (написанная БэмюэлСм ΠšΡ€Π΅ΠΌΠΏΠΏΠΎΠΌ (Samuel Krempp) содСрТит класс format, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‡Π΅Π½ΡŒ простыми. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3.4 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3.4. Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†Π΅Π»Ρ‹Ρ… Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС

#include <iostream>

#include <boost/format.hpp>


using namespace std;

using boost::format;

using boost.:io::str;

using boost::io::format_error;


int main() {

 try {

  format f("Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ %1% способа. %2% %3% %4%");

  f % 3;

  f % "Ρ‡Ρ‚ΠΎΠ±Ρ‹" % "это" % "ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.";

  cout << f << endl;

  f.clear(); // Бчистка Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² для форматирования Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅

  f.parse("Π­Ρ‚ΠΎ стоит $%d.");

  f % 50;

  cout << f << endl;

  int x = 11256099;

  string strx = str(format("%x") % x);

  cout << strx << endl;

 } catch (format_error &e) {

  cout << e.what() << endl;

 }

}

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ запускС этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ 3 способа, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π­Ρ‚ΠΎ стоит $50.

abc123

ИспользованиС класса format Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄Π²ΡƒΡ… шагов, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° format ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΅ΠΌΡƒ содСрТимого. Для ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ случая Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 3.4 я создал ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ format с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ вСрсии Π΅Π³ΠΎ синтаксиса.

format f(" Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ %1% способа, %2% %3% %4%");

Π’ строкС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΠΈ β€” это числа, ΠΎΠ±Ρ€Π°ΠΌΠ»Π΅Π½Π½Ρ‹Π΅ с ΠΎΠ±Π΅ΠΈΡ… сторон символами %. Π—Π°Ρ‚Π΅ΠΌ я Π½Π°Ρ‡ΠΈΠ½Π°ΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТимоС ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°.

f % 3;

f % "Ρ‡Ρ‚ΠΎΠ±Ρ‹" % "это" % "ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ;

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ % Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ форматирования Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Π»Π΅Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° format. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π½Π° строку, Ρ‚Π°ΠΊ ΠΈ нСсколько Ρ€Π°Π· Π² ΠΎΠ΄Π½ΠΎΠΉ строкС. Он Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ << для строк. Π§Ρ‚ΠΎ ΠΆΠ΅ касаСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° <<, ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ format ΠΌΠΎΠΆΠ½ΠΎ нСпосрСдствСнно Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли трСбуСтся ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² строку, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ str.

string s = f.str();

Если ΠΆΠ΅ Π²Π°ΠΌ нравится printf, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π½ΡƒΡŽ строку printf.

f.parse("Π­Ρ‚ΠΎ стоит $%d.*");

f % 50;

Если Π±ΡƒΠ΄Π΅Ρ‚ записано слишком ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ слишком ΠΌΠ°Π»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ строку Π² ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ format_error (ΠΈΠ»ΠΈ подкласс thereof).

Класс format достаточно ΠΌΠΎΡ‰Π΅Π½ ΠΈ содСрТит слишком ΠΌΠ½ΠΎΠ³ΠΎ возмоТностСй форматирования, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ здСсь, ΠΈ Π΅Π³ΠΎ стоит ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Boost ΠΈΠ»ΠΈ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, посСтитС web-сайт Boost ΠΏΠΎ адрСсу www.boost.org.

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

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

Π“Π»Π°Π²Π° 10.

3.3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, содСрТит Π»ΠΈ строка допустимоС число

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

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ строка string ΠΈ трСбуСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, содСрТит Π»ΠΈ ΠΎΠ½Π° допустимоС число.

РСшСниС

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ допустимости числа ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lexical_cast Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ допустимоС число ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π·Π½Π°ΠΊ минус, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π·Π½Π°ΠΊ плюс, Π½ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠ±Π΅Π». Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 3.5 приводятся нСсколько ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ² Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ lexical_cast.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3.5. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° числовой строки

#include <iostream>

#include <boost/lexical_cast.hpp>


using namespace std;

using boost::lexical_cast;

using boost::bad_lexical_cast;


template<typename T>

bool isValid(const string& num) {

 bool res = true;

 try {

  T tmp = lexical_cast<T>(num);

 } catch (bad_lexical_cast &e) {

  res = false;

 }

 return(res);

}


void test(const string& s) {

 if (isValid<int>(s))

  cout << s << " - допустимоС Ρ†Π΅Π»ΠΎΠ΅ число." << endl;

 else

  cout << s << " - HE допустимоС Ρ†Π΅Π»ΠΎΠ΅ число." << endl;

 if (isValid<double>(s))

  cout << s << " - допустимоС число Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности." << endl;

 else

  cout << s << " - HE допустимоС число Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности." << endl;

 if (isValid<float>(s))

  cout << s << " - допустимоС число ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ точности." << endl;

 else

  cout << s << " - HE допустимоС число ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ точности " << endl;

}


int main() {

 test("12345");

 test("1.23456");

 test("-1.23456");

 test(" - 1.23456");

 test("+1.23456");

 test(" 1.23456 ");

 test("asdf");

}

Π’ΠΎΡ‚ Π²Ρ‹Π²ΠΎΠ΄ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

12345 - допустимоС Ρ†Π΅Π»ΠΎΠ΅ число.

12345 - допустимоС число Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности.

12345 - допустимоС число ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ точности.

1.23456 - НЕ допустимоС Ρ†Π΅Π»ΠΎΠ΅ число.

1.23456 - допустимоС число Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности.

1.23456 - допустимоС число ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ точности.

-1.23456 - НЕ допустимоС Ρ†Π΅Π»ΠΎΠ΅ число.

-1.23456 - допустимоС число Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности.

-1.23456 - допустимоС число ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ точности.

- 1.23456 - НЕ допустимоС Ρ†Π΅Π»ΠΎΠ΅ число.

- 1 23466 - НЕ допустимоС число Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности.

- 1.23456 - НЕ допустимоС число ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ точности.

+1.23456 - НЕ допустимоС Ρ†Π΅Π»ΠΎΠ΅ число.

+1.23456 - допустимоС число Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности.

+1.23456 - допустимоС число ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ точности.

 1.23456 - НЕ допустимоС Ρ†Π΅Π»ΠΎΠ΅ число.

 1.23456 - НЕ допустимоС число Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности.