字符串转换为数字

风行水上 @ 2010-12-29 22:02:24
标签:

    这个问题经常碰到,却并不简单。

    十进制数的转换

    对于用十进制表示的字符串,"stdlib.h"提供了标准函数用于转换。值得提出的是,比如 atoi(),它的转换结果是有符号整数,如果要得到无符号整数,就要用别的办法了。

    #include <stdlib.h>
    
    int v = atoi("123");
    long vl = atol("12345");
    double vl = atof("3.1415");
    

    其他进制数的转换

    对于不是10进制的数值表示,比如十六进制、八进制等,"stdlib.h" 提供了 "strto*" 系列函数。

    /*
     * long int strtol ( const char * str, char ** endptr, int base );
     * unsigned long int strtoul ( const char * str, char ** endptr, int base );
     * double strtod ( const char * str, char ** endptr );
    */
    
    strtol("1010111", NULL, 2); // 二进制
    strtol("12", NULL, 8); // 八进制
    strtol("12", NULL, 16); // 十六进制
    strtol("12xyz", NULL, 36); // 三十六进制
    

    strtol 的进制可以是从2到36的任意一个,也可以是0。对于36进制,使用的十个数字和二十六个字母。如果指定的进制是0,则根据字符串的前缀是 "0x" 或者 "0"采用十六进制或者八进制。

    strtoulstrtol 的用法相同,除了返回值是无符号整型数(unsigned long int)。

    strtod 和 atof 的一样,除了可以通过endptr返回数值后的第一个字符。

    利用StringStream进行转换

    
        std::stringstream ss;
        ss << std::hex << "0x123";  // 十六进制 0x123
        ss >> v;
    
        printf("%3d %3x\n", v, v);
    
        std::stringstream ss2;
        ss2 << std::oct << "0123";  // 八进制  0123
        ss2 >> v;
        printf("%3d %3x\n", v, v);
    
        std::stringstream ss3;
        ss3 << std::dec << "123";  // 十进制  123
        ss3 >> v;
        printf("%3d %3x\n", v, v);
    

    封装为 lexical_cast

    据说,lexical_cast是boost库中的一个函数。下面的代码包含实现方法和用法:

    #include <sstream>
    
    template<typename T2, typename T1>
    inline T2 lexical_cast(const T1 &in, std::ios_base& (radix)(std::ios_base&)=std::hex) {
        T2 out;
        std::stringstream ss;
        ss << radix << in;
        ss >> out;
        return out;
    }       
    
    unsigned int v = lexical_cast<unsigned int>("12345");
    
    
    标签:

      分享到:
      comments powered by Disqus

      31/33ms