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; // 早开头 但是紧跟着是‘e‘ if (i == 0 && nextChar == ‘e‘) 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