需要包含头文件

#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 = ;
int num = std::stoi(str, &pos, );
std::cout << str.c_str() + pos << std::endl;

将输出 $ is enough ,num值为123,pos值为4。

C++17添加了更高效的数值和字符串转换函数,在头文件<charconv>中,这些函数内部没有内存申请开销,和区域无关(locale-independent)。

整形类型转成字符串:

to_chars_result  to_chars(char* first, char* last, IntegerT value, int base = 10);

此函数为模版函数,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(, ' ');
auto [ptr, ec] = std::to_chars(strNum.data(), strNum.data() + strNum.size(), ); 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 不会跳过字符串开头的空白。

 

 

C++标准库里自带的数值类型和字符串互相转换函数的更多相关文章

  1. C++异常之七 标准库里的异常类

    标准库里的异常类 C++标准提供了一组标准异常类,这些类以基类 Exception 开始,标准程序库抛出的所有异常,都派生于该基类,这些类构成如图所示的异常类的派生继承关系,该基类提供一个成员函数 w ...

  2. c++11 数值类型和字符串的相互转换

    string和数值类型转换 c++11提供了to_string方法,可以方便的将各种数值类型转换为 字符串类型: std::string to_string(int value); std::stri ...

  3. C#DateTime.ToString 格式化时间字符串和数值类型转换为字符串

    我们经常会遇到对时间进行转换,达到不同的显示效果,默认格式为:2006-6-6 14:33:34,如果要换成200606,06-2006,2006-6-6或更多的格式该怎么办呢?这里将要用到:Date ...

  4. [并发并行]_[C/C++]_[C++标准库里的线程安全问题]

    场景 1.写普通的程序时, 经常会使用cout来做输出, 每个进程只有一个控制台, 如果多线程调用cout时会出状况吗? 2.之所以研究cout会不会在并发下调用有问题, 是因为曾经有一个bug的崩溃 ...

  5. C#中货币类型和数值类型、字符串类型的转化

    1.定义textbox的数据 private void Form1_Load(object sender, EventArgs e) { this.textBox1.Text = String.For ...

  6. 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流

    最初的步骤 Python是大小写敏感的 任何在#符号右面的内容都是注释 >>> help('print')在“print”上使用引号,那样Python就可以理解我是希望获取关于“pr ...

  7. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

  8. 16.C++-初探标准库

    在别人代码里,经常看到std命名空间,比如使用std命名空间里的标准输入输出流对象cout: #include<iostream> using namespace std; int mai ...

  9. Python标准库映射类型与可散列数据类型的关系

    这里有两个概念似懂非懂,在这里明确一下: 映射类型: Python>3.2中,collections.abc模块有Mapping和MutableMapping两个抽象基类(Python2.6~3 ...

随机推荐

  1. SpringBoot+Mybatis+Maven+MySql小案例

    数据准备: 建表t_user ,插入数据..... 创建工程 构建pom.xml <?xml version="1.0" encoding="UTF-8" ...

  2. Cisco Port-Channel 设置(链路聚合--重点)

    Port-Channel 的在实际工作中的主要作用是将两个或多个端口捆绑成为一个虚拟通道. interface Port-channel1 description port(1/0/5-6) swit ...

  3. 在过滤器中获取在web.xml配置的初始化参数

    在过滤器中获取在web.xml配置的初始化参数   例如 <filter> <filter-name>cross-origin</filter-name> < ...

  4. jsp中cookie的一个报错

    写项目时在一个jsp页面中使用了cookie,用逗号分隔的数据,服务器老报错,搞了一个小时,终于清楚了,jsp的cookie中不能使用逗号. cookie规则:这个规则用于jsp.asp中(下面这两句 ...

  5. Qt编写控件属性设计器4-加载属性

    一.前言 控件能加载拖曳拉伸了,这些都是基本的前提工作,接下来的重点就是要动态加载选中控件的属性了,Qt的属性机制那是异常的强大,只能用强大到爆来形容,Qt中编写自定义控件,如果属性都用Q_PROPE ...

  6. 源码安装LNMP

    需要准备的安装包以及下载地址(只是一个大概地址,版本和下载方式需要自行选择): Nginx http://nginx.org/en/download.html nginx主程序包 MySQL http ...

  7. 修改root密码

    Linux 密码的修改,使用passwd 命令修改 命令如下图:sudo passwd root 即可修改成功

  8. html页面设置自动刷新

    在中添加如下: <meta HTTP-EQUIV="REFRESH" CONTENT="1"> 其中CONTENT对应刷新的间隔时间,这里为1秒. ...

  9. 游戏协议模拟测试工具(TcpEngine)使用简介

    功能介绍 在有的网络开发需要走二进制流协议场景,比如网络游戏开发,在开发阶段,前端和后端协商好协议后就分别开发.在开发写代码的时候,有时需要对端发送一条完整的协议过来触发一下自己的代码,进行单步调试或 ...

  10. 网络编程(socket).WinSocket_recvfrom出错,GetLastError()为10054

    1.在写 我的Qt598(vs2017)x64版本的 shadowsocks程序时遇到的. 具体问题情况 大概是这样:QUdpSocket(假设是sktA) connect接收函数,sktA侦听 端口 ...