题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
输入例子:
+2147483647 1a33
输出例子:
2147483647 0
import java.util.Scanner;
public class StringToInteger {
public static void main(String[] args) {
Scanner sin = new Scanner(System.in);
while (sin.hasNext()) {
String readLine = sin.nextLine();
int result = new StringToInteger().StrToInt(readLine.trim());
System.out.println(result + " " + statusValid);
}
sin.close();
}
// 定义全局变量, 判断输出的 0 是非法输入, 还是正常输入的 “0”
public static boolean statusValid = true;
public int StrToInt(String str) {
// 输入为 null 或者 字符串为空
if (str == null || str.length() == 0) {
statusValid = false;
return 0;
}
int start = 0;
int tag = 0;
if (str.charAt(0) == '+') {
start = 1;
tag = 1;
} else if (str.charAt(0) == '-') {
start = 1;
tag = -1;
} else {
start = 0;
tag = 1;
}
// str == “+” 或者 “-”
if (start == 1 && str.length() == 1) {
statusValid = false;
return 0;
}
long current = 0L;
for (int i = start; i < str.length(); i++) {
char temp = str.charAt(i);
if (temp >= '0' && temp <= '9') {
//current = current * 10 + (temp - '0');
current = (current << 1) + (current << 3) + (temp & 0xf);
} else {
// 字符串中有非法字符
statusValid = false;
return 0;
}
}
long result = tag * current;
// 上溢出或者下溢出
if (tag == 1 && result > Integer.MAX_VALUE || tag == -1 && result < Integer.MIN_VALUE) {
statusValid = false;
return 0;
}
statusValid = true;
return (int) result;
}