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

2019-06-28  本文已影响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+)?");

}
上一篇下一篇

猜你喜欢

热点阅读