判断字符串是否表示数值(包括整数和小数)

本文介绍了一种判断字符串是否表示数值的方法,通过三种不同的技术方案实现:使用正则表达式匹配、尝试转换为数字类型以及状态机算法。每种方法都有详细的解释和代码示例。

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

package com.niuke;

/**
 * Created by admin on 2018/3/9.
 * 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
 */
public class IsNumber {
    public boolean isNumeric1(char[] str) {
        //1  用正则表达式   判断其是否是数字
        String res=String.valueOf(str);
        return res.matches("[\\+-]?[0-9]*(\\.[0-9])?([eE][\\+-]?[0-9]+)?");
        /**
         * 正则表达式说明:
         * [\+-]?  + -号可出现也可不出现
         * [0-9]*  整数部分是否出现    [0-9]可以用\\d代替
         * (\.[0-9])?  出现小数点后面必须跟数字
         * ([eE][\+-]?[0-9]+)  若有指数部分E或e肯定出现 + -可以不出现
         *                      紧接着可以跟着整数,也可以什么都没有
         */
    }

    public boolean isNumeric2(char[] str) {
        //2  看它是否能转化为一个数
        try {
            double db=Double.parseDouble(String.valueOf(str));
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    public boolean isNumeric3(char[] str) {
        //3 作标记把所有可能的情况都考虑到
        boolean sign=false;//+ -是否出现过
        boolean Ee=false;//E e 是否出现过
        boolean decimal=false;//小数点是否出现过
        int len=str.length;
        for(int i=0;i<len;i++) {
            if(str[i]=='E'||str[i]=='e') {
                //e后面一定要有数字
                if(i==len-1) {
                    return false;
                }
                if(Ee) {//不能存在两个E
                    return false;
                }
                Ee=true;
            } else if(str[i]=='+'||str[i]=='-') {
                //第二次出现+ -符号必须跟在E后面
                if(sign&&str[i-1]!='e'&&str[i-1]!='E') {
                    return false;
                }
                //第一次出现+ -号且不是在字符串开头,也必须紧跟在e后面
                if(!sign&&i>0&&str[i-1]!='e'&&str[i-1]!='E') {
                    return false;
                }
                sign=true;
            } else if(str[i]=='.') {
                //e后面不能接小数点 小数点不能出现两次
                if(decimal||Ee) {
                    return false;
                }
                decimal=true;
            } else if(str[i]<'0'||str[i]>'9') {//不合法字符
                return false;
            }
        }
        return true;
    }

    //用自动机来判断  开辟新思路   附上个图 

}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值