C++标准库里自带的数值类型和字符串互相转换函数
需要包含头文件
#include <string>
数值类型转成string类型:
string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);
string类型转成数值类型:
int stoi(const string& str, size_t *pos=0, int base=10);
long stol(const string& str, size_t *pos=0, int base=10);
unsigned long stoul(const string& str, size_t *pos=0, int base=10);
long long stoll(const string& str, size_t *pos=0, int base=10);
unsigned long long stoull(const string& str, size_t *pos=0, int base=10);
float stof(const string& str, size_t *pos=0);
double stod(const string& str, size_t *pos=0);
long double stold(const string& str, size_t *pos=0);
这些函数忽略str开头的空白,pos参数保存已处理的字符个数,如果是nullptr则忽略,base参数为数的底,进制数,默认为10。
比如
const std::string str = " 123$ is enough"; size_t pos = 0; int num = std::stoi(str, &pos, 10); std::cout << str.c_str() + pos << std::endl;
将输出 $ is enough ,num值为123,pos值为4。
C++17添加了更高效的数值和字符串转换函数,在头文件<charconv>中,这些函数内部没有内存申请开销,和区域无关(locale-independent)。
整形类型转成字符串:
此函数为模版函数,IntegerT为整形类型或char类型,first, last为调用者提供的用于存储转换结果的连续内存区间。
函数返回类型为
struct to_chars_result {
char* ptr;
errc ec; //type: enum class errc
};
如果转换成功的话,ptr为最后一个写入字符的下一个字符的地址,ec值等于std::errc()。转换不成功的话,ptr值为last。
例子:
std::string strNum(16, ' '); auto [ptr, ec] = std::to_chars(strNum.data(), strNum.data() + strNum.size(), 123); if (ec == std::errc()) { //successful std::cout << strNum << std::endl; } else { //failed }
auto [ptr, ec]为C++17中的结构化绑定用法,转换后strNum值为"123",ptr值为strNum.data() + 3。
浮点数转成字符串:
to_chars_result to_chars(char* first, char* last, FloatT value);
to_chars_result to_chars(char* first, char* last, FloatT value, chars_format format);
to_chars_result to_chars(char* first, char* last, FloatT value, chars_format format, int precision);
FloatT可以是 float, double, 或 long double 类型,format 类型为 chars_format ,可以是下列值的组合,默认值为 chars_format::general。
enum class chars_format { scientific, // Style: (-)d.ddde±dd fixed, // Style: (-)ddd.ddd hex, // Style: (-)h.hhhp±d (Note: no 0x!) general = fixed | scientific };
字符串转为数值类型:
from_chars_result from_chars(const char* first, const char* last, IntegerT& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, FloatT& value, chars_format format = chars_format::general);
first, last为被转换的字符串的开始和结束地址,IntegerT为整形类型,FloatT为浮点数类型。
from_chars_result 类型为:
struct from_chars_result { const char* ptr; errc ec; };
转换成功的话ec值等于std::errc(),ptr 值为第一个不能被转换字符的地址,如果字符串都能被转换的话,ptr 值为 last.
如果是字符串表示的实际值超出 IntegerT 或 FloatT 的区间,ec值为 std::errc::result_out_of_range。
如果转换失败,ec值为 std::errc::invalid_argument, ptr 值为 first。
另外注意:from_chars 不会跳过字符串开头的空白。