字符串转换为数字

long double stod(const char *ptr , bool *bOk = 0 , int *d = 0)
{
    assert(ptr != 0);
    const char *cursor = ptr;
    switch(*cursor)
    {
    case ‘0‘:
    {
        ++cursor;
        switch(*cursor)
        {
        //! 此时被认为是8进制数
        case ‘0‘:
        case ‘1‘:
        case ‘2‘:
        case ‘3‘:
        case ‘4‘:
        case ‘5‘:
        case ‘6‘:
        case ‘7‘:
        {
            long long llRet = *cursor - ‘0‘;
            ++cursor;
            while(*cursor)
            {
                if (‘0‘ <= *cursor && *cursor <= ‘7‘)
                {
                    llRet *= 8LL;
                    llRet += *cursor - ‘0‘;
                    ++cursor;
                }
                else
                {
                    break;
                }
            }
            if (bOk)
                *bOk = true;

            if (d)
                *d = 8;

            return static_cast<long double>(llRet);
        }

        //! 此时被认为是16进制数
        case ‘x‘:
        case ‘X‘:
        {
            ++cursor;
            long long llRet = 0LL;
            while(*cursor)
            {
                if ((‘a‘ <= *cursor && *cursor <= ‘f‘))
                {
                    llRet *= 16LL;
                    llRet += *cursor - ‘a‘ + 10LL;
                    ++cursor;
                }
                else if (‘A‘ <= *cursor && *cursor <= ‘Z‘)
                {
                    llRet *= 16LL;
                    llRet += *cursor - ‘A‘ + 10LL;
                    ++cursor;
                }
                else if (‘0‘ <= *cursor && *cursor <= ‘9‘)
                {
                    llRet *= 16LL;
                    llRet += *cursor - ‘0‘;
                    ++cursor;
                }
                else
                {
                    break;
                }
            }

            if (bOk)
                *bOk = true;

            if (d)
                *d = 16;

            return static_cast<long double>(llRet);
        }

        //! 此时被认为是小数
        case ‘.‘:
        {
            long double ret = 0.0;
            long double div = 10.0L;
            ++cursor;
            while(*cursor)
            {
                if (‘0‘ <= *cursor && *cursor <= ‘9‘)
                {
                    ret += static_cast<long double>(*cursor - ‘0‘) / div;
                    div *= 10.0L;
                    ++cursor;
                }
                else
                    break;
            }
            if (bOk)
                *bOk = true;

            if (d)
                *d = 10;

            return ret;
        }

        //! 此时被认为是十进制数
        case ‘8‘:
        case ‘9‘:
        {
            long long llRet = *cursor - ‘0‘;
            ++cursor;
            while(*cursor)
            {
                if (‘0‘ <= *cursor && *cursor <= ‘9‘)
                {
                    llRet *= 10LL;
                    llRet += *cursor - ‘0‘;
                    ++cursor;
                }
                else if (*cursor == ‘.‘)
                {
                    ++cursor;
                    long double ret = 0.0L;
                    long double div = 10.0L;
                    while(*cursor)
                    {
                        if (‘0‘ <= *cursor && *cursor <= ‘9‘)
                        {
                            ret += static_cast<long double>(*cursor - ‘0‘) / div;
                            div *= 10.0L;
                            ++cursor;
                        }
                        else
                        {
                            if (bOk)
                                *bOk = true;

                            if (d)
                                *d = 10;

                            return static_cast<long double>(ret + llRet);
                        }
                    }
                }
                else
                    break;
            }
            if (bOk)
                *bOk = true;

            if (d)
                *d = 10;

            return static_cast<long double>(llRet);
        }

        //! 转换失败
        default:
        {
            if (bOk)
                *bOk = false;
            return 0.0;
        }
        }
    }
        break;
    case ‘-‘:
    {
        ++cursor;
        long long llRet = 0LL;
        while(*cursor)
        {
            if (‘0‘ <= *cursor && *cursor <= ‘9‘)
            {
                llRet *= 10LL;
                llRet += *cursor - ‘0‘;
                ++cursor;
            }
            else if (*cursor == ‘.‘)
            {
                long double ret = 0.0;
                long double div = 10.0L;
                ++cursor;
                while(*cursor)
                {
                    if (isdigit(*cursor))
                    {
                        ret += static_cast<long double>(*cursor - ‘0‘) / div;
                        div *= 10.0L;
                        ++cursor;
                    }
                    else
                    {
                        if (bOk)
                            *bOk = true;

                        if (d)
                            *d = 10;

                        return static_cast<long double>(-llRet - ret);
                    }
                }
            }
            else
                break;
        }
        if (bOk)
            *bOk = true;

        if (d)
            *d = 10;

        return static_cast<long double>(-llRet);
    }
    case ‘.‘:
    {
        long double ret = 0.0L;
        long double div = 10.0L;
        ++cursor;
        while(*cursor)
        {
            if (isdigit(*cursor))
            {
                ret += static_cast<long double>(*cursor - ‘0‘) / div;
                div *= 10.0L;
                ++cursor;
            }
            else
                break;
        }
        if (bOk)
            *bOk = true;

        if (d)
            *d = 10;

        return ret;
    }
    case ‘1‘:
    case ‘2‘:
    case ‘3‘:
    case ‘4‘:
    case ‘5‘:
    case ‘6‘:
    case ‘7‘:
    case ‘8‘:
    case ‘9‘:
    {
        long long llRet = *cursor - ‘0‘;
        ++cursor;
        while(*cursor)
        {
            if (isdigit(*cursor))
            {
                llRet *= 10LL;
                llRet += *cursor - ‘0‘;
                ++cursor;
            }
            else if (*cursor == ‘.‘)
            {
                ++cursor;
                long double ret = 0.0L;
                long double div = 10.0L;
                while(*cursor)
                {
                    if(isdigit(*cursor))
                    {
                        ret += static_cast<long double>(*cursor - ‘0‘) / div;
                        div *= 10.0L;
                        ++cursor;
                    }
                    else
                    {
                        if (bOk)
                            *bOk = true;

                        if (d)
                            *d = 10;

                        return static_cast<long double>(llRet + ret);
                    }
                }
            }
            else
                break;
        }

        if (bOk)
            *bOk = true;

        if (d)
            *d = 10;

        return static_cast<long double>(llRet);
    }
    default:
    {
        if (bOk)
            *bOk = false;

        return 0.0;
    }
    }
}
时间: 2024-08-09 13:28:29

字符串转换为数字的相关文章

剑指Offer解题报告(Java版)——字符串转换为数字 49

? ? 引言 ? ? STOI是很常见的一道题,leetcode上也有,字符串转换为数字一般都会有现成的函数去实现这样的功能,但有时候需要我们理解其中的具体实现,因为虽然是个很常见的问题,但实际上需要考虑的问题还是很多的,尤其是corner case的处理,而这类问题一般要考虑两点:一点是符号,另外一点是越界 ? ? 分析问题 ? ? 如果字符串前面有空格怎么办,一般来说中间是没有空格的,但是前后可能有空格,所以我们首先需要去掉多余的空格字符,用到trim函数 ? ? 然后就是字符串中有可能第一

js字符串转换为数字 总结

a. 将一个字符串转换为数字的一种缺少些技巧但是很清楚明白的方法就是:把Number()构造函数作为一个函数来调用:  var number = Number(string_value); b. parseInt()只截取整数,如果一个字符串以"0x"或"0X"开头,parseInt()将其解析成为一个十六进制的数字,parseInt()甚至可以接受一个参数来指定要解析的数字的基数,合法的值在2到36之间 parseInt("3 blind mice&qu

Javascript学习笔记:2种字符串转换为数字的方式

①使用parseInt/parseFloat(在ECMAScript6中是Number.parseInt/Number.parseFloat) 1 console.log(parseInt('a10'));//NaN 2 console.log(parseInt('1a0'));//1 3 console.log(parseInt('10a'));//10 4 console.log(parseInt('10'));//10 5 6 console.log(parseFloat('a10.1')

javascript如何将字符串转换为数字

javascript如何将字符串转换为数字:在编码中有可能用到将字符串转换为数字,尤其是在涉及数字计算的环境,下面就简单介绍一下如何进行转换.1).parseInt()函数进行转换:此函数可以解析一个字符串,并返回一个整数.代码实例如下: parseInt("12px");//返回12 parseInt("0xA");//返回10 parseInt("2.3");//返回2 parseInt("blue");//返回NaN 更

关于字符串转换为数字的几点注意

字符串转换为数字的方法: ①Number():空字符串为0,对象先调用valueOf(),如果返回NaN,调用toString()方法 ②parseInt():空字符串为NaN,可以进行其他进制到十进制的转换 ③parseFloat():只识别十进制,但是可以将一个科学计数法表示的数字表示成整数 勿忘:十进制转换其他进制的方法:num.toString(进制数)====>字符串 null和undefined没有这个方法====>String(); 转换为字符串的另一种方法:“”+要转换的

C语言中将字符串转换为数字的方法

C语言提供了几个标准库函数,可以将字符串转换为任意类型(整型.长整型.浮点型等)的数字.以下是用atoi()函数将字符串转换为整数的一个例子: # include <stdio. h># include <stdlib. h>void main (void) ;void main (void){    int num;    char * str = "100";    num = atoi(str);    printf("The string 's

把字符串转换为数字

C当中有一些函数专门用于把字符串形式转换成数值形式. printf()函数和sprintf()函数 -->通过转换说明吧数字从数字形式转换为字符串形式: scanf()函数把输入字符串转换为数值形式: 应用场景: 编写程序需要使用数值命令形参,但是命令形参被读取为字符串.要使用数值必须先把字符串转换为数字. atoi()函数: int atoi(char *str); 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int mai

字符串转换为数字类型

// @param s为字符串,n为数字function fn(obj){    //转换为String类型    var s = obj +"";    //转换为number类型    var n = +obj;}

不使用库函数将字符串转换为数字

第14行,把参数n的绝对值赋给temp,以后在计算各个位的整数时用temp,这样保证在负数情况下取余不会出现问题. 第20行,取整数最末尾的数字,+'0'是将其转换为字符, 第21行,取剩余数字, 当执行完while(temp)这个循环,就将该整数的所有位都从右到左的剥离出来,并依此存于buf数组中,例如temp=123,则此时buf[0]=3,buf[1]=2,buf[2]=3,这是倒序的. 第24行,计算转换后字符串的长度,如果是负数,长度还应该再加1,因为还要存放负号. 第27行开始的wh

js将字符串转换为数字等类型

1.js提供了parseInt()和parseFloat()两个转换函数. 2.ECMAScript中可用的3种强制类型转换如下:  Boolean(value)——把给定的值转换成Boolean型:  Number(value)——把给定的值转换成数字(可以是整数或浮点数):  String(value)——把给定的值转换成字符串. 3.利用js变量弱类型转换 <script> var str= '012.345 '; var x = str-0; x = x*1; </script&