​string与数值的转换​

​C++11​

​C++11之前​

​格式化数字字符串​




string与数值的转换

C++11

 头文件:#include <string>

 数值转string

 to_string(val):可以将其他类型转换为string。

 string转数值

s:表示整数内容的字符串;

b:表示转换所用的基数,默认为10(表示十进制);

p:是size_t的指针,用来保存s中第一个非数值字符的下标,p默认为0,即函数不返回下标。

  stoi(s, p, b):string转int

  stol(s, p, b):string转long

  stod(s, p, b):string转double

  stof(s, p, b):string转float

  stold(s, p, b):string转long dluble

  stoul(s, p, b), stoll(s, p, b), stoull(s, p, b)等。

  


void testTypeConvert()
{
//int --> string
int i = 5;
string s = to_string(i);
cout << s << endl;
//double --> string
double d = 3.14;
cout << to_string(d) << endl;
//long --> string
long l = 123234567;
cout << to_string(l) << endl;
//char --> string
char c = 'a';
cout << to_string(c) << endl; //自动转换成int类型的参数
//char --> string
string cStr; cStr += c;
cout << cStr << endl;


s = "123.257";
//string --> int;
cout << stoi(s) << endl;
//string --> long
cout << stol(s) << endl;
//string --> float
cout << stof(s) << endl;
//string --> doubel
cout << stod(s) << endl;
}


C++11之前


 
atoi(将字符串转换成整型数)

相关函数
atof,atol,atrtod,strtol,strtoul

表头文件
#include&lt;stdlib.h&gt;

定义函数
int atoi(const char *nptr);

附加说明
atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。

范例
#include&lt;stdlib.h&gt;

mian()
{
char a[]=-100;
char b[]=”456”;
int c;

c=atoi(a)+atoi(b);
printf(c=%d ,c);
}

执行
c=356

atol(将字符串转换成长整型数)
相关函数
atof,atoi,strtod,strtol,strtoul

表头文件
#include&lt;stdlib.h&gt;

定义函数
long atol(const char *nptr);

函数说明
atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(&#39;&#39;)才结束转换,并将结果返回。

返回值
返回转换后的长整型数。

附加说明
atol()与使用strtol(nptr,(char**)NULL,10);结果相同。

范例

#include&lt;stdlib.h&gt;

main()
{
char a[]=”1000000000”;
char b[]= 234567890;
long c;
c=atol(a)+atol(b);
printf(“c=%d ,c);
}
执行
c=1234567890

gcvt(将浮点型数转换为字符串,取四舍五入)

相关函数
ecvt,fcvt,sprintf

表头文件
#include&lt;stdlib.h&gt;

定义函数
char *gcvt(double number,size_t ndigits,char *buf);

函数说明
gcvt()用来将参数number转换成ASCII码字符串,参数ndigits表示显示的位数。gcvt()与ecvt()和fcvt()不同的地方在于,gcvt()所转换后的字符串包含小数点或正负符号。若转换成功,转换后的字符串会放在参数buf指针所指的空间。

返回值
返回一字符串指针,此地址即为buf指针。

附加说明

范例

#include&lt;stdlib.h&gt;
main()
{
double a=123.45;
double b=-1234.56;
char *ptr;
int decpt,sign;
gcvt(a,5,ptr);
printf(“a value=%s ,ptr);
ptr=gcvt(b,6,ptr);
printf(“b value=%s ,ptr);
}

执行
a value=123.45
b value=-1234.56


自己写转换方法了,代码如下:

  从其它类型转换为string,定义一个模板类的方法。

  从string转换为其它类型,定义多个重载函数。


#include <strstream>
template<class T>
string convertToString(const T val)
{
string s;
std::strstream ss;
ss << val;
ss >> s;
return s;
}


int convertStringToInt(const string &s)
{
int val;
std::strstream ss;
ss << s;
ss >> val;
return val;
}

double convertStringToDouble(const string &s)
{
double val;
std::strstream ss;
ss << s;
ss >> val;
return val;
}

long convertStringToLong(const string &s)
{
long val;
std::strstream ss;
ss << s;
ss >> val;
return val;
}

void testConvert()
{
//convert other type to string
cout << "convert other type to string:" << endl;
string s = convertToString(44.5);
cout << s << endl;
int ii = 125;
cout << convertToString(ii) << endl;
double dd = 3.1415926;
cout << convertToString(dd) << endl;

//convert from string to other type
cout << "convert from string to other type:" << endl;
int i = convertStringToInt("12.5");
cout << i << endl;
double d = convertStringToDouble("12.5");
cout << d << endl;
long l = convertStringToLong("1234567");
cout << l << endl;
}


格式化数字字符串

sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代  itoa。  

如:  //把整数123 打印成一个字符串保存在s 中。   

sprintf(s, "%d", 123); //产生"123"



 IAR 类似问题:



   已经添加了<stdlib.h>,但TORNADO下编译出现 undefined   reference   to   `itoa'错误。


解决方法:TORNADO不支持itoa方法,在Tornado 2.0 Online Manuals : Routines中找不到itoa方法。用sprintf代替itoa吧。


关键词:Tornado; undefined   reference   to   `itoa'; VXWORKS;sprintf


KeyWords:Tornado; undefined   reference   to   `itoa'; VXWORKS;sprintf




不涉及编译器时:


一、数值型数据转化成字符型数据

 


杨涛说数据库还是什么东西在读入数据的时候只能识别字符型数据

然后我就想了想怎么把数值型数据转化成字符型


法一、


根据ASC码:

(1)对于个位数,可以将其值加48然后赋给一个字符型变量;

(2)对于两位数及以上的数,可以将其各位上的数码分解出来然后同(1),这是需要一个数组来放这一系列数据;


法二、


由各类数值型数据之间的转换想到的:

将数值型数据 +  '0'即可


int a = 9;

char b;

b = a + '0';


其他步骤同法一,单个分解,对于两位数及以上的数同样需要一个数组;


不过以上这两种方法计算量相当大!!


法三、


偶然发现存在这样一个现成的函数itoa,可以非常方便的实现这个功能

函数原型 char *itoa(int value,char *string,int radix)

参数说明 value是要转化的数值,string是转化后的字符串,radix是转换的进制,

函数返回一个指向string的指针,

调用这个函数需要包含  stdlib.h  这个头文件



通用方法(针对非COM数据类型)

用sprintf完成转换

char     buffer[200];

char     c   =   '1 ';

int       i   =   35;

long     j   =   1000;

float   f   =   1.7320534f;

sprintf(   buffer,   "%c ",c);

sprintf(   buffer,   "%d ",i);

sprintf(   buffer,   "%d ",j);

sprintf(   buffer,   "%f ",f);


  %% 印出百分比符号,不转换。


  %c 整数转成对应的 ASCII 字元。


  %d 整数转成十进位。


  %f 倍精确度数字转成浮点数。


  %o 整数转成八进位。


  %s 整数转成字符串。


  %x 整数转成小写十六进位。


  %X 整数转成大写十六进位。 ]