20210511判断字符串是否表示数值

本文介绍了一个函数,用于判断输入的字符串是否能表示一个有效的数值(整数或小数)。文章详细阐述了数值的构成规则,并提供了一段C++代码实现,通过状态机的方式检查字符串是否符合这些规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

数值(按顺序)可以分成以下几个部分:
1若干空格
2一个 小数 或者 整数
3(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
4若干空格

小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(’+’ 或 ‘-’)
下述格式之一:
至少一位数字,后面跟着一个点 ‘.’
至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
一个点 ‘.’ ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
1(可选)一个符号字符(’+’ 或 ‘-’)
2至少一位数字

部分数值列举如下:
["+100", “5e2”, “-123”, “3.1416”, “-1E-16”, “0123”]
部分非数值列举如下:
[“12e”, “1a3.14”, “1.2.3”, “±5”, “12e+5.4”]

class Solution {
public:
    bool isNumber(string s) {
        int i=0;
        while(s[i]==' ') i++;//处理前面空格
        if(s[i]=='+'||s[i]=='-') i++;//处理+-
        i=integerAOrDecimal(s,i);//返回不是数字的一位 判断整数/小数
        if(i==-1) return false;
        if(s[i]=='e'||s[i]=='E'){
            i++;
            if(s[i]=='+'||s[i]=='-') i++;//处理+-
            int temp1=i;
            i=Isnum(s,i);
            if(i==temp1) return false;//e后面没有数字则错误
        }
        while(i<s.size()&&s[i]==' ') i++;//处理后面的空格
        if(i==s.size()) return true;
        else return false;

    }
    //0-9
    int Isnum(const string& s,int i){
        while(i<s.size()&&s[i]>='0'&&s[i]<='9') i++;
        return i;
    }

 int integerAOrDecimal(const string& s, int i){
        int n_orig1 = i;
        i = Isnum(s, i);
        int n_vary1 = i;
        // 判断是否是整数
        if (s[i] != '.'){
            return n_vary1 == n_orig1 ? -1 : n_vary1;//判断是否存在0-9的数值
        }
        // 判断是否是小数
        // 跨过小数点
        i ++;
        int n_orig2 = i;
        i = Isnum(s, i);
        int n_vary2 = i;
        if (n_orig1 == n_vary1 && n_orig2 == n_vary2) return -1;
        //小数点前面后面至少有一个数
        return n_vary2;
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值