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 = ;
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)。
整形类型转成字符串:
此函数为模版函数,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++标准库里自带的数值类型和字符串互相转换函数的更多相关文章
- C++异常之七 标准库里的异常类
标准库里的异常类 C++标准提供了一组标准异常类,这些类以基类 Exception 开始,标准程序库抛出的所有异常,都派生于该基类,这些类构成如图所示的异常类的派生继承关系,该基类提供一个成员函数 w ...
- c++11 数值类型和字符串的相互转换
string和数值类型转换 c++11提供了to_string方法,可以方便的将各种数值类型转换为 字符串类型: std::string to_string(int value); std::stri ...
- C#DateTime.ToString 格式化时间字符串和数值类型转换为字符串
我们经常会遇到对时间进行转换,达到不同的显示效果,默认格式为:2006-6-6 14:33:34,如果要换成200606,06-2006,2006-6-6或更多的格式该怎么办呢?这里将要用到:Date ...
- [并发并行]_[C/C++]_[C++标准库里的线程安全问题]
场景 1.写普通的程序时, 经常会使用cout来做输出, 每个进程只有一个控制台, 如果多线程调用cout时会出状况吗? 2.之所以研究cout会不会在并发下调用有问题, 是因为曾经有一个bug的崩溃 ...
- C#中货币类型和数值类型、字符串类型的转化
1.定义textbox的数据 private void Form1_Load(object sender, EventArgs e) { this.textBox1.Text = String.For ...
- 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流
最初的步骤 Python是大小写敏感的 任何在#符号右面的内容都是注释 >>> help('print')在“print”上使用引号,那样Python就可以理解我是希望获取关于“pr ...
- python第六天 函数 python标准库实例大全
今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...
- 16.C++-初探标准库
在别人代码里,经常看到std命名空间,比如使用std命名空间里的标准输入输出流对象cout: #include<iostream> using namespace std; int mai ...
- Python标准库映射类型与可散列数据类型的关系
这里有两个概念似懂非懂,在这里明确一下: 映射类型: Python>3.2中,collections.abc模块有Mapping和MutableMapping两个抽象基类(Python2.6~3 ...
随机推荐
- [Java复习] 分布式事务 Part 2
分布式事务了解吗?如果解决分布式事务问题的? 面试官心里: 只要聊到你做了分布式系统,必问分布式事务,起码得知道有哪些方案,一般怎么来做,每个方案的优缺点是什么. 为什么要有分布式事务? 分布式事务实 ...
- python中关于shutdown 和closesocket的彻底理解!
关于shutdown 和closesocket的彻底理解! shutdown 和closesocket 来,咱们彻底的来讨论一下这个shutdown 和closesocket 从函数调用上来分析(ms ...
- 最简单的freemarker用法实例
1.下载freemarker-2.3.19.jar到web项目的lib下. 2.新建freemarker引擎协助类 package com.bxsurvey.sys.process.uti ...
- 一百四十二:CMS系统之帖子详情页面布局
定义一个404页面 <!DOCTYPE html><html lang="en"><head> <meta charset="U ...
- win7下docker环境安装
最近公司涉及到对docker容器引擎的使用,所以就在网上各种搜索,由于是win7系统,所以在使用上更是麻烦,遇到各种错误就是无法成功启动docker,经过两天的各种尝试下,终于安装成功,在此记录一下使 ...
- centos7.5安装图形界面
1.centos7.4安装图形界面 yum check-update && yum install epel-release && yum groupinstall & ...
- 【馨儿收藏】群星《2019最新好听DJ舞曲精选》全系列【WAV/在线/百度】(持续更新)
本人作为一名音乐发烧友,一直喜欢追求无损音乐,平时在开发编程无聊的时候,希望享受音乐的过程,追求完美,我这边整理了一系列的比较不错,新的好听的无损音乐,希望大家能够喜欢. [馨儿收藏]群星<20 ...
- 海量无损高音质音乐文件分享180TB(持续更新)
海量无损高音质音乐文件分享180TBWAV,flac,ape格式(持续更新),由于本人是音乐发烧爱好者,收集海量的无损音乐,已经分类好了,比较方便查找,但是本地没法存储,所有放在网盘中,并且我这边还会 ...
- ipad 没有数据线如何上传文件到局域网windows PC 的解决方案
是的,ios 的封闭性,真麻烦,不想用数据线,还不想用iTunes ,那你找对了. 方案一: (好像只能上传文件,不能下载,能在线查看媒体.) 我的想法是在Windows建立一个http file s ...
- CenOS 7 安装Tomcat
1.首先需要安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载 http://mirrors.tuna.tsinghua.edu.cn/apa ...