C++使用boost::lexical_cast进行数值转换

在STL库中,我们可以通过stringstream来实现字符串和数字间的转换:

    int i = 0;
    stringstream ss;

    ss << "123";
    ss >> i;

但stringstream是没有错误检查的功能,例如对如如下代码,会将i给赋值为12.

    ss << "12.3";
    ss >> i;

甚至连这样的代码都能正常运行:

    ss << "hello world";
    ss >> i;

这显然不是我们所想要看到的。为了解决这一问题,可以通过boost::lexical_cast来实现数值转换:

    int i = boost::lexical_cast<int>("123");
    double d = boost::lexical_cast<double>("12.3");

对于非法的转换,则会抛异常:

    try
    {
        int i = boost::lexical_cast<int>("12.3");
    }
    catch (boost::bad_lexical_cast& e)
    {
        cout << e.what() << endl;
    }

对于16机制数字的转换,可以以如下方式进行:

    template <typename ElemT>
    struct HexTo {
        ElemT value;
        operator ElemT() const {return value;}
        friend std::istream& operator>>(std::istream& in, HexTo& out) {
            in >> std::hex >> out.value;
            return in;
        }
    };

    int main(void)
    {
        int x = boost::lexical_cast<HexTo<int>>("0x10");
    }

到此这篇关于C++使用boost::lexical_cast进行数值转换的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++ boost 时间与日期处理详细介绍

    boost 时间与日期处理 导视: 类 特点 缺点 说明 timer 计时基类 不适合大跨度时间 适用大部分的普通计时 progress_timer 继承自timer 可以自动写入流中 只精确到0.01s 如果需要更精确,可派生个类,调用stream的precision设置 progress_display 图形化显示进度 只能输出到cout 如果还有其他输出则会干扰进度显示. 折中的办法是重新显示 pd.restart(size); pd+= pNum; date 日期结构,时间点 -- da

  • C++ boost::asio编程-域名解析详细介绍

    C++ boost::asio编程-域名解析 在网络通信中通常我们并不直接使用IP地址,而是使用域名.这时候我们就需要用reslover类来通过域名获取IP,它可以实现 与IP版本无关的网址解析. #include "stdafx.h" #include "boost/asio.hpp" #include "boost/shared_ptr.hpp" #include "boost/thread.hpp" #include &

  • C++中Boost的转换函数

    Boost的转换函数是对C++中的四种类型转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)的一些补充和扩展,在阅读本文前,请先熟悉C++中的四种类型转换函数相关知识. polymorphic_cast C++提供了dynamic_cast来实现运行时的类型转换,但是如果用来转换指针时,需要记得检查返回值(这是很多程序员容易忘掉的地方),否则一旦转换失败,将获得一个NULL指针,无异于给程序埋下了一个定时炸弹. Boost的pol

  • C++中Boost.Chrono时间库的使用方法

    前言 大家应该都有所体会,时钟这个东西在程序中扮演者重要的角色,在系统编程的时候睡眠.带超时的等待.带超时的条件变量.带超时的锁都会用到,但是往往对特定系统依赖性很大,感觉即使不考虑系统的跨平台性,如果能使用一个稳定的接口,同时如果能够方便的对时刻.时段等进行相关的操作和运算,将是再好不过的了. 在boost库中和时间相关的库有Boost.DateTime和Boost.Chrono,前者专注于时间时刻以及本地化相关的内容,而后者主要是时刻.时长和时间的计算等内容.当然,C++11标准已经支持st

  • C++ 中boost::share_ptr智能指针的使用方法

    C++ 中boost::share_ptr智能指针的使用方法 最近项目中使用boost库的智能指针,感觉智能指针还是蛮强大的,在此贴出自己学习过程中编写的测试代码,以供其他想了解boost智能指针的朋友参考,有讲得不正确之处欢迎指出讨论.当然,使用boost智能指针首先要编译boost库,具体方法可以网上查询,在此不再赘述. 智能指针能够使C++的开发简单化,主要是它能够自动管理内存的释放,而且能够做更多的事情,即使用智能指针,则可以再代码中new了之后不用delete,智能指针自己会帮助你管理

  • C++用boost.signal实现多播委托

    boost.signal提供了一个多播委托机制,通过它可以非常容易的实现观察者模式: void print_sum(float x, float y) { std::cout << "The sum is " << x+y << std::endl; } void print_product(float x, float y) { std::cout << "The product is " << x*y

  • C++通过boost.date_time进行时间运算

    标准C函数的时间运算是非常不好用的,boost提供了一个跨平台的日期库boost.date_time,通过它可以快速实现各种时间运算. boost.date_time中的时间对象为boost::posix_time::ptime,在<boost/date_time.hpp>中定义,它的常用操作如下. 获取现在时间: ptime now = second_clock::local_time(); cout << now << endl; 获取日期信息: cout <

  • C++ boost::asio编程-同步TCP详解及实例代码

    boost::asio编程-同步TCP boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. boost.asio库支持TCP.UDP.ICMP通信协议. 下面介绍同步TCP模式: 大家好!我是同步方式! 我的主要特点就是执着!所有的操作都要完成或出错才会返回,不过偶的执着被大家称之为阻塞,实在是郁闷~~(场下一片嘘声),其实这样 也是有好处的,比如逻辑清晰,编程比较容易. 在服务器端,我会做个socket交给acceptor对象,让它

  • C++中的boost::function库简介

    boost::function Boost.Function库用来提供一个对象化的函数指针,通过它可以很容易的将一个函数封装为仿函数. boost::function库可以支持自由函数,函数对象,类成员函数.而且参数个数多达10个.boost::function库利用模板技术来实现.生成的代码有很高的运行效率.首先我们还是以一个例子简单的说明它的用法: #include <iostream> #include <boost/function.hpp> using namespace

  • C++使用boost::lexical_cast进行数值转换

    在STL库中,我们可以通过stringstream来实现字符串和数字间的转换: int i = 0; stringstream ss; ss << "123"; ss >> i; 但stringstream是没有错误检查的功能,例如对如如下代码,会将i给赋值为12. ss << "12.3"; ss >> i; 甚至连这样的代码都能正常运行: ss << "hello world"; s

  • C#数值转换-隐式数值转换表参考

    什么是隐式转换 Implicit Conversion 隐式转换就是直接使用,比如可以把一个 byte 类型直接用在 int 上. 比如以下直接把 byte 的 b 赋给 int 的 n,之间是直接用的,没存在什么额外的关键字,全由系统自动完成类型转换. 复制代码 代码如下: byte b = 1; int n = b; 隐式数值转换表(摘自 MSDN) 从 到 sbyte short.int.long.float.double 或 decimal byte short.ushort.int.u

  • JavaScript数值转换的三种方式总结

    在JavaScript中,数值转换一般有三种方式: 一.Number(param)函数:param可以用于任何数据类型 1.1 param是Boolean值,true和false分别转换为1和0: 1.2 param是数值,只是简单的传入和返回 1.3 param是null和undefined,分别返回0和NaN 1.4 param是字符串,遵循下列规则: 1.4.1 如果字符串中只包含数字,则转换为十进制,前导0被忽略: 1.4.2 如果字符串中包含有效的浮点数格式,则返回对应的浮点数值,前导

  • C#数值转换-显式数值转换表(参考)

    什么是显式转换Explicit Conversion就是在将一种类型转换成另外一种类型时,需要额外的代码来完成这种转换. 复制代码 代码如下: int n = 1; byte b = (byte)n; // 正确,显式转换 byte b2 = n;      // 错误 显式转换需要注意,它的结果不一定是我们想要的. 复制代码 代码如下: int n = 256; byte b = (byte)n; // 结果是 0 上面的结果是 0,因为超过 255 了,它就从 0 开始:如果 n 是 257

  • laravel5.6实现数值转换

    在laravel框架中,如果希望从数据库中取出的值就是我们希望的类型,可以使用laravel框架模型中的$casts属性值来将需要的字段转换成需要的类型,用法如下: <?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 应该被转化为原生类型的属性 * * @var array */ protected $casts = [ //字段=>希望转换的类型 'is_a

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

    目录 一.引言 二.Boost.LexicalCast 2.1 示例1 2.2 示例2 三.lexical_cast与c/c++提供类似接口的比较 3.1 两者比较 3.2 样例 一.引言 在boost库中,有一个函数Boost.LexicalCast可以将数字和字符串进行双向转换.本文介绍这种用法的案例. 二.Boost.LexicalCast Boost.LexicalCast 提供了一个转换运算符,boost::lexical_cast,它可以将数字从字符串转换为数字类型,例如 int 或

  • C++ Boost Uuid超详细讲解

    目录 一.说明 二.Boost.Uuid库示例和代码 一.说明 Boost.Uuid 为 UUID 提供生成器. UUID 是不依赖于中央协调实例的通用唯一标识符.例如,没有数据库存储所有生成的 UUID,可以检查这些 UUID 是否使用了新的 UUID. UUID 由必须唯一标识组件的分布式系统使用.例如,Microsoft 使用 UUID 来识别 COM 世界中的接口.对于为 COM 开发的新接口,可以轻松分配唯一标识符. UUID 是 128 位数字.存在多种生成 UUID 的方法.例如,

  • C++ Boost Conversion超详细讲解

    目录 一.说明 二.示例和代码 三.更多示例代码 一.说明 Boost.Conversion 在头文件 boost/cast.hpp 中定义了转换运算符 boost::polymorphic_cast 和 boost::polymorphic_downcast.它们旨在更精确地处理类型转换——通常使用 dynamic_cast 完成. 库由两个文件组成.分别在boost/cast.hpp文件中定义了boost::polymorphic_cast和boost::polymorphic_downca

随机推荐