需要包含头文件

#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. tensorflow cpu问题

    返回: -- ::] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 ...

  2. C语言练习,可以解析协议,主机,路径,询问,片段等

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...

  3. nginx负载均衡分配策略有哪些?

    nginx负载均衡分配策略有哪些?   答: 1.轮询(默认,不用在upstream中配置)方式 2.weight(权重) 当指定的服务器的权重参数,权重占比为负载均衡决定的一部分.权重大负载就大. ...

  4. linuxan安装redis出现Newer version of jemalloc required错误

    linux安装redis执行make命令时出现问题 解决方法 make MALLOC=libc 如果要指定安装文件夹 使用命令:make PREFIX  = /usr/local/redis(文件夹路 ...

  5. 重新认识Java 8的HashMap

    [转自]美团技术博客 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型.随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实 ...

  6. ubuntu 16.04 sudo nopasswd

    修改sudoers配置文件:~$ sudo vi /etc/sudoers 在文件末尾添加需要sudo输入密码的user:[user] ALL=NOPASSWD:ALL 表示sysadmin这个组在进 ...

  7. centos6.8yum 安装mysql

    1:查看是否已有mysql版本 rpm -qa | grep mysql 删除mysql 账号和用户组 删除/etc/my.cnf 2:有的话就删除 rpm -e mysql-...... 或者 co ...

  8. .NET实体框架EF之CodeFirst

    ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Sch ...

  9. 【Kail 学习笔记】自用KAIL更新源

    打开 /etc/apt/source.list 添加-保存即可 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contr ...

  10. conda换源

    装完Anaconda后,建议更新所有的包,因为以后使用很可能会报错. 而更新的时候conda的官方源在美国,不换源就非常蓝瘦,有生之年够呛了. 换源: conda config --add chann ...