將一個字符串轉換成一個整數,要求不能使用字符串轉換整數的庫函數。
- 數值為0或者字符串不是一個合法的數值則返回0
public class StrToInt {
private static boolean valid;
public static int StrToInt(String str) {
if (str == null ||str.length() == 0 || str.trim().equals("")) return 0;
boolean isNegitive = false;
//設置number為長整型,防止太大
long number = 0;
for (int i=0;i<str.length();i++){
//如果第一個符號是正負號,符號改變變量,正號不用管
if (i == 0 && (str.charAt(i) == '-' || str.charAt(i) == '+')){
if (str.charAt(i) == '-'){
isNegitive = true;
}
//只有一個符號,失效
if (str.length() == 1){
return 0;
}
continue;
}
//如果有一個符號不是數字,直接退出
if (str.charAt(i) <'0' || str.charAt(i) > '9'){
return 0;
}
//設置符號,得出結果
int flag = isNegitive ? -1 : 1;
//注意:直接在原有基礎上賦值,重新組合數字的技巧
number = number*10 + flag*(str.charAt(i) - '0');
//判斷常數的上下界限
if ((!isNegitive && number > Integer.MAX_VALUE) || (isNegitive && number < Integer.MIN_VALUE)){
return 0;
}
}
valid = true;
return (int) number;
}
public static boolean flag;
public static int StrToInt1(String str) {
flag = false;
//判斷輸入是否合法
if (str == null || str.trim().equals("")) {
flag = true;
return 0;
}
// symbol=0,說明該數為正數;symbol=1,該數為負數;start用來區(qū)分第一位是否為符號位
int symbol = 0;
int start = 0;
char[] chars = str.trim().toCharArray();
if (chars[0] == '+') {
start = 1;
} else if (chars[0] == '-') {
start = 1;
symbol = 1;
}
int result = 0;
for (int i = start; i < chars.length; i++) {
if (chars[i] > '9' || chars[i] < '0') {
flag = true;
return 0;
}
int sum= result * 10 + (int) (chars[i] - '0');
if((sum-(int) (chars[i] - '0'))/10!=result){
flag=true;
return 0;
}
result=result * 10 + (int) (chars[i] - '0');
/*
* 本人認為java熱門第一判斷是否溢出是錯誤的,舉個反例
* 當輸入為value=2147483648時,在計算機內部的表示應該是-2147483648
* 顯然value>Integer.MAX_VALUE是不成立的
*/
}
// 注意:java中-1的n次方不能用:(-1)^n .'^'異或運算
// 注意,當value=-2147483648時,value=-value
result = (int) Math.pow(-1, symbol) * result;
return result;
}
public static void main(String[] args) {
System.out.println(StrToInt("123"));
System.out.println(StrToInt("-12"));
System.out.println(StrToInt("+12"));
System.out.println(StrToInt("+")+ " "+ StrToInt.valid);
System.out.println(StrToInt("0")+ " "+ StrToInt.valid);
System.out.println(StrToInt("12345678901112")+ " "+ StrToInt.valid);
}
}