美文网首页
【剑指20】表示数值的字符串

【剑指20】表示数值的字符串

作者: 浅浅星空 | 来源:发表于2019-06-28 22:02 被阅读0次

    题目描述

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

    分析

    一.一个字符串是数值的要求:

    1)每个字符串都必须是 0--9,e,E,+, - , .(小数点)的格式

    2)+ -,e,E,.不能在末尾

    3)小数点只能出现一次

    4)正负号在中间时,前面是e,E,后面是数字

    5)e或者E的后面是+ -的时候,后面不能有小数点

        public static boolean isNumeric(char[] str) {
            String s = new String(str);
    
            //
            for (int i = 0; i < str.length; i++) {
                char c = s.charAt(i);
                if (!(c >= '0' && c <= '9') && c != '+' && c != '-' && c != '.' && c != 'e' && c != 'E') {
                    return false;
                }
            }
    
            //
            if (s.charAt(s.length() - 1) == '.' || s.charAt(s.length() - 1) == '+' || s.charAt(s.length() - 1) == '-' || s.charAt(s.length() - 1) == 'e' || s.charAt(s.length() - 1) == 'E') {
                return false;
            }
    
            //
            if (s.indexOf(".") != s.lastIndexOf(".")) {
                return false;
            }
    
            //
            for (int i = 1; i < s.length() - 1; i++) {
                char c = s.charAt(i);
                if (c == '+' || c == '-') {
                    if (!(s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E') || !(s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9')) {
                        return false;
                    }
                }
            }
            //
            for (int i = 0; i < s.length() - 1; i++) {
                if (s.charAt(i) == 'e' || s.charAt(i) == 'E') {
                    if (s.charAt(i + 1) == '+' || s.charAt(i) == '-') {
                        if (s.indexOf(".", i + 2) != -1) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
    

    二.正则匹配

    []  : 字符集合
    
    ()  : 分组
    
    ?   : 重复 0 ~ 1
    
    +   : 重复 1 ~ n
    
    *   : 重复 0 ~ n
    
    .   : 任意字符
    
    \\. : 转义后的 .
    
    \\d : 数字
    
    public boolean isNumeric(char[] str) {
    
        if (str == null || str.length == 0)
    
            return false;
    
        return new String(str).matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");
    
    }
    

    相关文章

      网友评论

          本文标题:【剑指20】表示数值的字符串

          本文链接:https://www.haomeiwen.com/subject/znjycctx.html