Private-Bookers
C++. Сборник рецептов
вернуться

Когсуэлл Джефф

Шрифт:

Вы ведите, что для последнего значения, представляющего собой шестнадцатеричное число, он выбрасывает исключение. При преобразовании чисел с основанием, отличным от 10, требуется использовать функции

strtol
.

Также имеются версии функций

strtol
для работы с «широкими» символами. Эквивалент
strtol
для работы с широкими символами — это
wcstol
, которая объявлена в
<cwchar>
. Эквивалентами функций
strtod
и
strtoul
являются
wcstod
и
wcstoul
. Каждая из этих функций точно такая же, за исключением того, что те параметры, которые в функциях для узких символов имеют тип
char*
, в функциях для широких символов имеют тип
wchar_t*
.

Смотри также

Рецепт 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%");

  • Читать дальше
  • 1
  • ...
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • ...

Private-Bookers - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

Полезные ссылки

  • Моя полка