数字到字符串、字符串到数字的转换

数字到字符串与字符串到数字的转换在很多情况下用到。然而C++98就没有提供这样一个工具,但是我们可以通过很多方式来实现这种转换。在后来的C++发展中也收录了这一简单常用的模块。我们来看看其发展历程。

C++ -------stringstreams

C++的stream库是很强大的,以前的时候通过
的输入/输出转换成字符串。使用stringstreams的时候需要 #include <sstream>。

我们来看下面的例子:

数字到字符串

       通过stringstreams将数字转换到字符串,需要两个步骤:

       1.将变量的数值输出到流中;

       2.获取流中的字符串类容。

int value = 1234;
string str;
stringstreams conent;
conent<<value;
str = conent.str();

这段代码可以简化一下:

int value = 1234;

string str = static_cast<ostringstream *>(&(ostringstream ()<<value))->str();

这里构造了一个字符串流对象,执行输出流操作ostringstream ()<<value,然后<<返回一个ostream(ostringstream 的基类)的引用。这个结果需要转换称字符串流,所以我们用static_cast进行强制转换。

我们来看看完整的例子:

#include<iostream>
#include <sstream>
#include <string> // this should be already included in <sstream>
using std::ostringstream;
using std::cout;
using std::endl;
using std::string;
int main(void){
	double Number = 0.12;           // Number to convert to string
	string str = static_cast<ostringstream *>(&(ostringstream()<<Number))->str();
	cout<<str<<endl;
}
输出:

0.12

字符串到数字的转换。

       通过stringstreams将一个字符串转换为数字也需要两个步骤:

       1.利用字符串来构造流;

       2.将值读入变量。

这个转换中我们会用到istringstream 。这将字符串往数字转换的时候我们需要注意些问题,例如这个字符串为“abcd”,是不能转换的,所以在转换的时候需要做一些安全检查。

下面一个简单的例子:

string str="1234";
int value;
istringstream content(str);
if(!(content>>value))//转换失败的时候将返回0  此处进行安全检查
     value = 0;
我们的程序可以写得更简单些:

string str = "1234";

int value;

if(!istringstream(str)>>value))value = 0;

istringstream通过str构造一个对象,然后通过>>value转换成一个数值变量。如果转换失败,value被设置为0。

通常istringstream(可以被用于输入输出)被用于更复杂的环境中。

我们可以将上面的两个例子做成简单的函数:

template <typename T>
  string NumberToString ( T value)
  {
     ostringstream ss;
     ss << value;
     return ss.str();
  }
用法:NumberToString(value),返回字符串。
template <typename T>
  T StringToNumber ( const string &str)
  {
     istringstream ss(str);
     T result;
     return ss >> result ? result : 0;
  }
用法:StringToNumber<数据类型>(str),返回数值。
第二个函数中,我们没有进行安全检查。

C++11

在c++11中引入的标准库的一些函数,我们可以利用一些转换函数进行轻松的转换。

std::to_string 将数值转换成字符串。

std::stoi  std::stof 前者将字符串转换成int,后者将字符串转换成float。

这些函数声明在<string>中。

int value= 123;
string str= to_string(value);

str= "456"
value= stoi(str);
当然,对于标准库,我们的态度应该是能用标准库中的函数尽量用。

C++ boost library

在C++中利用stringstreams进行转换需要一些代码。然而在boost库中,我们可以利用lexical_cast 进行直接转换。
要想运用boost库,我们需要包含其头文件#include <boost/lexical_cast.hpp>
str = boost::lexical_cast<string>(value);

// String to number conversion:
value = boost::lexical_cast<Type>(str);//Type为我们想转换为的数据类型
上述转换并没用考虑到异常情况。当boost::lexical_cast转换失败时,它会抛出boost::bad_lexical_cast异常,这个异常继承于std::bad_cast.
所以我们可以这样:
try
{
    value = boost::lexical_cast<Type>(Text);
}
catch ( const boost::bad_lexical_cast &exc ) // conversion failed, exception thrown by lexical_cast and caught
{
    value = 0; 
}

C  ---  stdio

在C中并没有流库,但是sprintf可以被用来那种转换。
数字到字符串:
sprintf远远没有streams方便,因为它需要根据数值类型进行代码转换。
int value = 123; 

char Result[16]; 

sprintf ( Result, "%d", value);
字符串到数字
sprintf一样,scanf可以运用于字符串数组。
char Text[] = "456"; 

int Result;

sscanf ( Text, "%d", &Result );
如果字符串本身不是个数字,将导致转换失败。这个时候我们应该返回0。
char Text[] = "456"; 

int Result; 

int Succeeded = sscanf ( Text, "%d", &Result );

if ( !Succeeded || Succeeded == EOF ) 
    Result = 0;
对于c语言中这样的转换我们也可以写成一个自己的函数,这里就不再详述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值