C++ Boost实现数字与字符串转化详解

一、引言

在boost库中,有一个函数Boost.LexicalCast可以将数字和字符串进行双向转换。本文介绍这种用法的案例。

二、Boost.LexicalCast

Boost.LexicalCast 提供了一个转换运算符,boost::lexical_cast,它可以将数字从字符串转换为数字类型,例如 int 或 double ,反之亦然。 boost::lexical_cast 是 std::stoi()、std::stod() 和 std::to_string() 等函数的替代方案,这些函数已添加到 C++11 的标准库中。

2.1 示例1

使用boost::lexical_cast

#include 
#include 
#include 
int main()
{
  std::string s = boost::lexical_cast(123);
  std::cout << s << '\n';
  double d = boost::lexical_cast(s);
  std::cout << d << '\n';
}

转换运算符 boost::lexical_cast 可以转换不同类型的数字。示例 6.1 首先将整数 123 转换为字符串,然后将字符串转换为浮点数。要使用 boost::lexical_cast,请包含头文件 boost/lexical_cast.hpp。

boost::lexical_cast 在内部使用流来执行转换。因此,只能转换具有重载运算符<< 和运算符>> 的类型。但是,可以针对某些类型优化 boost::lexical_cast 以实现更有效的转换。

2.2 示例2

boost::bad_lexical_cast当出错时

#include 
#include 
#include 
int main()
{
  try
  {
    int i = boost::lexical_cast("abc");
    std::cout << i << '\n';
  }
  catch (const boost::bad_lexical_cast &e)
  {
    std::cerr << e.what() << '\n';
  }
}

如果转换失败,则会抛出从 std::bad_cast 派生的 boost::bad_lexical_cast 类型的异常。示例 2 引发异常,因为字符串“abc”无法转换为 int 类型的数字。

三、lexical_cast与c/c++提供类似接口的比较

3.1 两者比较

标准c家族中包含此类函数,例如atoi与itoa等,它们的缺点是:

(1)各个转换都是单向的,双向转换为不同函数,各种转换函数不同,接口众多;

(2)仅支持基础数据类型的子集,如int,long,double;

(3)不能提供统一的接口,易用性差;

c++中提供了stringstream,使用它进行格式转换可读性较差,使用起点较高,只是简单的转换,stringstream太重量级。

boost提供了lexical_cast,使用统一接口形式实现任意类型之间的转换,增强了易用性。但如果需要严密控制精度的转换,仍然推荐使用stringstream;数值之间的转换,推荐使用numeric_cast。

3.2 样例

#include "iostream"
#include "boost/lexical_cast.hpp" // 需要包含的头文件
using boost::lexical_cast;
using boost::bad_lexical_cast;
using namespace std;
int main()
{
    char* p="32768";
    int i=0;
    try
    {
        i=lexical_cast(p); // 将字符串转化为整数
    }
    catch(bad_lexical_cast&)    // 转换失败会抛出一个异常
    {
        i=0;
    }
    cout << i << endl;
    return i;
}

到此这篇关于C++ Boost实现数字与字符串转化详解的文章就介绍到这了,更多相关C++数字与字符串转化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(C++ Boost实现数字与字符串转化详解)