首先得有两个枚举类,用于枚举数字和符号
private enum Number{
ZERO(0, "0"), ONE(1, "1"), TOW(2, "2"),
THREE(3, "3"), FOUR(4, "4"),
FIVE(5, "5"), SIX(6, "6"),
SEVEN(7, "7"), EIGHT(8, "8"), NINE(9, "9");
private int number;
private String numberString;
private Number(int number, String numberString){
this.number = number;
this.numberString = numberString;
}
public String getNumberString() {
return numberString;
}
public int getNumber() {
return number;
}
}
private enum Symbol{
PLUS("+"), DECREASE("-");
private Symbol(String symbol){
this.symbol = symbol;
}
private String symbol;
public String getSymbol() {
return symbol;
}
}
然后为具体实现逻辑:分为三部分(头部符号检测、数值部分截取、字符转换为数字)
private static int atoi(String numberString){
if (numberString == null || numberString.equals(""))
return 0;
// check 开头部分是否合理
HashMap<Symbol, String> ret = consumeHead(numberString);
// 符号不正确
if (ret.isEmpty()){
return 0;
}
AtomicReference<Symbol> symbol = new AtomicReference<>();
AtomicReference<String> nextNumberString = new AtomicReference<>();
ret.forEach((k, v) ->{
symbol.set(k);
nextNumberString.set(v);
});
// 逐一check ascii码
String body = consumeBody(nextNumberString.get());
return parseInt(body, symbol.get());
}
private static int parseInt(String number, Symbol symbol) {
if (symbol.getSymbol().equals(Symbol.DECREASE.getSymbol()))
return -getBaseInt(number);
else
return getBaseInt(number);
}
private static int getBaseInt(String number){
int c = 0;
long ret = 0;
while (c != number.length()){
String s = number.substring(c, c + 1);
for (Number value : Number.values()) {
if (value.getNumberString().equals(s)){
if (ret <= Integer.MAX_VALUE){
if (c != 0)
ret = ret * 10 + value.getNumber();
else
ret = value.getNumber();
}else{
return Integer.MAX_VALUE;
}
}
}
c++;
}
return ret > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)ret;
}
private static String consumeBody(String number) {
int forSub = 0;
for (int i = 0; i < number.length(); i++){
if (number.charAt(i) >= 48 && number.charAt(i) <= 57){
forSub ++;
}else
break;
}
return number.substring(0, forSub);
}
private static HashMap<Symbol, String> consumeHead(String number) {
HashMap<Symbol, String> map = new HashMap<>();
int sym = -1;
for (int i = 0; i < number.length(); i++){
if (number.charAt(i) == 32){
int j = i + 1;
while (j < number.length()){
if (number.charAt(j) != 32)
break;
j++;
}
if (i == number.length())
break;
i = j;
}
// 第一个字符为符号
if (number.charAt(i) == 43 || number.charAt(i) == 45){
sym = i;
break;
}
// 第一个字符为数字
if (! (number.charAt(i) >= 48 && number.charAt(i) <= 57)){
break;
}else {
sym = i;
break;
}
}
if (sym != -1){
if (number.charAt(sym) == 45)
map.put(Symbol.DECREASE, number.substring(sym + 1));
else if (number.charAt(sym) == 43)
map.put(Symbol.PLUS, number.substring(sym + 1));
else
map.put(Symbol.PLUS, number.substring(sym));
}
return map;
}