[Leetcode]-- Valid Number

package validNumber;

public class Solution {
    public boolean isNumber(String s) {
        if (s == null)
            return false;

        char[] sArr = s.trim().toCharArray();

        if (sArr.length == 0)
            return false;

        // if string 长度为1 且不是数字
        if (sArr.length == 1 && !Character.isDigit(sArr[0]))
            return false;

        boolean decimalFound = false; // flag 标记是否遇到过 '.'
        boolean eFound = false; // flag 标记是否遇到过 'e'

        // 遍历string的每一个character
        int end = sArr.length - 1;
        for (int i = 0; i <= end; i++) {

            // 当前character 一前一后两个指针。 指针超出设为'x'
            char nextChar = (i >= end ? 'x' : sArr[i + 1]);
            char prevChar = (i <= 0 ? 'x' : sArr[i - 1]);
            switch (sArr[i]) {
            // '+' and '—' 只可以放在数字最左边或是 'e'的右边
            case '+':
            case '-':
                // 不在'e' 的右边和开头
                if (prevChar != 'e' && i != 0)
                    return false;
                // 在末尾
                if (i == end)
                    return false;
                // 早开头 但是next 不是 '.' 也不是数
                if (i == 0 && nextChar != '.' && (!Character.isDigit(nextChar)) )
                    return false;
                break;

            case '.':
                // 出现过'.' or 'e' 就不能出现'.' 了
                if (decimalFound || eFound)
                    return false;
                // '.' 前面不是数且后面不是数
                if (!Character.isDigit(prevChar)
                        && !Character.isDigit(nextChar))
                    return false;
                decimalFound = true;
                break;
            case 'e':
                // 'e' 出现过就不能再出现了
                if (eFound)
                    return false;
                // 'e' 之前又不是数字又不是'.'
                if (!Character.isDigit(prevChar) && prevChar != '.')
                    return false;
                // 'e' 之后不是数也不是'+' or '-' return false;
                if (!Character.isDigit(nextChar)
                        && (nextChar != '-' && nextChar != '+')) {
                    return false;
                }
                // 'e' 在开头和结尾
                if (end == i || i == 0)
                    return false;
                eFound = true;
                break;
            // 遇到空格
            case ' ':
                return false;
                // 其它情况 不是数 return false
            default:
                if (!Character.isDigit(sArr[i]))
                    return false;
            }

        }
        return true;
    }
}

思路 讲String检测所有 false的cases, 如果全通过 return true

原文地址:https://www.cnblogs.com/RazerLu/p/3534768.html