表示数值的字符串-Java实现

表示数值的字符串

http://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2

个人题解,可能存在错误,有的话请狠批。

自定义匹配规则

public static boolean isNumeric(char[] str) {
        if (str == null || str.length == 0)
            return false;
        //科学计数法aEb中 b必须是整数,且不为0
        boolean word = false;//统计+或-是否出现过
        boolean e = false;//统计e或E是否出现过
        boolean node = false; //统计.出现是否出现过
        for (int i = 0; i < str.length; i++) {
            //字符不能是其它非法字符
            if (str[i] == '+' || str[i] == '-') {
                //确保+前面要么空,要么是e
                if (i != 0 && str[i - 1] != 'e' && str[i - 1] != 'E')
                    return false;
            } else if (str[i] == '.') {
                //判断.是否在e后面,e后面不能出现小数
                if (e == true)
                    return false;
                //.后面必须接数字
                if (i + 1 >= str.length || str[i + 1] > '9' || str[i + 1] < '0')
                    return false;
                if (node == true) {
                    //在一个数字中出现多个.
                    return false;
                } else {
                    node = true;
                }
            } else if (str[i] == 'e' || str[i] == 'E') {
                //确保e、E是第一次出现
                if (e == true)
                    return false;
                else {
                    //确保前一位是数字和下一位有字符
                    if (str[i - 1] >= '0' && str[i - 1] <= '9' && i + 1 < str.length) {
                        e = true;
                    } else {
                        return false;
                    }
                }
            } else if (str[i] >= '0' && str[i] <= '9') {
                if (i == 1 && str[0] == '0') {
                    return false;//不能出现0xxxxx这种情况
                } else if (e == true && str[i - 1] == '0' && (str[i - 2] == 'e' || str[i - 2] == 'E')) {
                    return false;
                }
            } else {
                //非法字符
                return false;
            }
        }
        return true;
    }

正则表达式
我看很多答案没有考虑第一个数字为0的情况,0100是非法的吧(自认为)。

public static boolean isNumeric2(char[] str) {
        //使用正则表达式匹配
        String strs = new String(str);
        //[\\-\\+]?首字符可以出现+、-,也可以不出现,接下来就是数字,第一个要么是1~9,要么是0,0后面必须配上.
        //([0]\\.\\d+|[1-9]\\d*(\\.\\d+)?|\\.\\d+)这里面有3个选项,以|为间隔,
        //选项1:[0]\\.\\d+ 第一个数字为0的话,后面必须接小数点.和任意整数
        //选项2:[1-9]\\d*(\\.\\d+)? 第一个数字是1~9,后面可以接整数 或者接小数部分
        //选项3:直接是小数部分
        //[eE][\+\-]?[1-9]\d* 对于指数部分,我还是秉着首个数字不能为0的情况
        String pattern = "[\-\+]?([0]\.\d+|[1-9]\d*(\.\d+)?|\.\d+)([eE][\+\-]?[1-9]\d*)?";
        return Pattern.matches(pattern, strs);
    }
全部评论
.2这种是合法的吗?
点赞 回复 分享
发布于 2020-07-02 10:38

相关推荐

07-09 18:28
门头沟学院 Java
写着提前批,结果还要实习4个月以上???
程序员牛肉:这种不用看,直接投了,面试的时候问对应的HR就行。有可能他们是直接复制的暑期实习的模板。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务