Преобразование строки в число

Для преобразования строки в число используются следующие функции:

#include <string>
int stoi(const string &str, size_t *idx=0, int radix=10);
int stoi(const wstring &str, size_t *idx=0, int radix=10);
long stol(const string &str, size_t *idx=0, int radix=10);
long stol(const wstring &str, size_t *idx=0, int radix=10);
unsigned long stoul(const string &str, size_t *idx=0, int radix=10);
unsigned long stoul(const wstring &str, size_t *idx=0, int radix=10);
long long stoll(const string &str, size_t *idx=0, int radix=10);
long long stoll(const wstring &str, size_t *idx=0, int radix=10);
unsigned long long stoull(const string &str, size_t *idx=0,
                          int radix=10);
unsigned long long stoull(const wstring &str, size_t *idx=0,
                          int radix=10);
float stof(const string &str, size_t *idx=0);
float stof(const wstring &str, size_t *idx=0);
double stod(const string &str, size_t *idx=0);
double stod(const wstring &str, size_t *idx=0);
long double stold(const string &str, size_t *idx=0);
long double stold(const wstring &str, size_t *idx=0);

Пробельные символы в начале строки игнорируются. Пример преобразования строки в целое число:

std::string str_dec(" \n\r25");
int x = std::stoi(str_dec);
std::cout << x << std::endl; // 25

Считывание символов заканчивается на символе не являющемся записью числа. Индекс этого символа доступен через параметр idx, если он не равен нулевому указателю:

std::string str("5s10");
size_t idx = 0;
std::cout << std::stoi(str, &idx) << std::endl;            // 5
std::cout << str.substr(idx) << std::endl;                 // s10

В параметре radix можно указать систему счисления. Если задано число 0, то система счисления определяется автоматически:

std::string str_bin("111");
std::string str_oct("025");
std::string str_hex("0xff");
std::cout << std::stoi(str_oct, nullptr, 0) << std::endl;  // 21
std::cout << std::stoi(str_bin, nullptr, 2) << std::endl;  // 7
std::cout << std::stoi(str_oct, nullptr, 8) << std::endl;  // 21
std::cout << std::stoi(str_hex, nullptr, 16) << std::endl; // 255

Если в строке нет числа, то генерируется исключение invalid_argument. Пример обработки исключения:

std::string str("str");
try {
   std::cout << std::stoi(str) << std::endl;
} catch (std::invalid_argument &e) {
   std::cout << "Не удалось преобразовать" << std::endl;
} // Результат: Не удалось преобразовать

Если число выходит за диапазон значений для типа, то генерируется исключение out_of_range. Дополнительно переменной errno присваивается значение ERANGE. Пример обработки исключения:

std::string str("2147483649");
try {
   std::cout << std::stoi(str) << std::endl;
} catch (std::out_of_range &e) {
   std::cout << "Не удалось преобразовать. errno = "
             << errno << std::endl;
} // Результат: Не удалось преобразовать. errno = 34

Обратите внимание: от настроек локали зависит десятичный разделитель вещественных чисел:

std::string str("2,5");
std::setlocale(LC_ALL, "C");
std::cout << std::stod(str) << std::endl;      // 2
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::cout << std::stod(str) << std::endl;      // 2.5

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов