Оператор % в библиотеке форматирования был переопределен так, чтобы добавлять указанные в нем переменные в левую часть объекта 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.

<p>3.3. Проверка, содержит ли строка допустимое число</p>Проблема

Имеется строка string и требуется определить, содержит ли она допустимое число.

Решение

Для проверки допустимости числа можно использовать шаблон функции lexical_cast библиотеки Boost. При таком подходе допустимое число может включать предшествующий знак минус, предшествующий знак плюс, но не пробел. В примере 3.5 приводятся несколько образцов типов форматов, с которыми работает lexical_cast.

Пример 3.5. Проверка числовой строки

#include

#include

using namespace std;

using boost::lexical_cast;

using boost::bad_lexical_cast;

template

bool isValid(const string& num) {

 bool res = true;

 try {

  T tmp = lexical_cast(num);

 } catch (bad_lexical_cast &e) {

  res = false;

 }

 return(res);

}

void test(const string& s) {

 if (isValid(s))

  cout << s << " - допустимое целое число." << endl;

 else

  cout << s << " - HE допустимое целое число." << endl;

 if (isValid(s))

  cout << s << " - допустимое число двойной точности." << endl;

 else

  cout << s << " - HE допустимое число двойной точности." << endl;

 if (isValid(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 - НЕ допустимое целое число.

Перейти на страницу:

Похожие книги