生活随笔
收集整理的這篇文章主要介紹了
从键盘获取字符串,并把字符串转数字
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.有很多漏洞的實(shí)現(xiàn)方法
public static void main(String[] args) { ?? ??? ?System.out.println("開始輸入:"); ?? ??? ?//從鍵盤輸入字符串 ?? ??? ?Scanner input = new Scanner(System.in); ?? ??? ?//獲取鍵盤輸入的字符串 ?? ??? ?String str = input.nextLine(); ?? ??? ?System.out.println("結(jié)束"); ?? ??? ?//字符串轉(zhuǎn)字符數(shù)組 ?? ??? ?char[] num = str.toCharArray(); ?? ??? ?//使用StringBuffer對象存儲拼接后的數(shù)字 ?? ??? ?StringBuffer hire = new StringBuffer(); ?? ??? ?//如果字符串以“-”開頭 ?? ??? ?if(str.startsWith("-")) { ?? ??? ??? ?//在拼接前給字符串加上符號 ?? ??? ??? ?hire.append("-"); ?? ??? ??? ?for (int i = 0; i < num.length; i++) { ?? ??? ??? ??? ?hire.append(num[i]); ?? ??? ??? ?} ?? ??? ?}else { ?? ??? ??? ?//Character.isDigit(a) 判斷a是否是數(shù)字,如果是,則返回true,否則返回false ?? ??? ??? ?//判斷字符串的開否是否是數(shù)字,如果不是,直接輸出0 ?? ??? ??? ?if(!Character.isDigit(num[0])) { ?? ??? ??? ??? ?System.out.println(0); ?? ??? ??? ?}else { ?? ??? ??? ??? ?//如果是數(shù)字,則對數(shù)字進(jìn)行拼接 ?? ??? ??? ??? ?hire.append("-"); ?? ??? ??? ??? ?for (int i = 0; i < num.length; i++) { ?? ??? ??? ??? ??? ?hire.append(num[i]); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?System.out.println(hire); ?? ?} |
2.借鑒大神的實(shí)現(xiàn)方式
| public class Demo { ?? ?public static void main(String[] args) { ?? ??? ?System.out.println("開始輸入:"); ?? ??? ?//從鍵盤輸入字符串 ?? ??? ?Scanner input = new Scanner(System.in); ?? ??? ?//獲取鍵盤輸入的字符串 ?? ??? ?String str = input.nextLine(); ?? ??? ?System.out.println("結(jié)束"); ?? ??? ?int myAtoi = myAtoi(str); ?? ??? ?System.out.println(myAtoi); ?? ?} ?? ? ?? ?public static int myAtoi(String str) { ?? ? ? ?// 合法性判斷 ?? ? ? ?if (str.isEmpty()) return 0; ?? ? ? ?// 正負(fù)號標(biāo)記 ?? ? ? ?int sign = 1; ?? ? ? ?// 轉(zhuǎn)換值 ?? ? ? ?int base = 0; ?? ? ? ?// 索引位數(shù) ?? ? ? ?int i = 0; ?? ? ? ?// 剔除開始空白字符 ?? ? ? ?while (str.charAt(i) == ' ') ?? ? ? ? ? ?i++; ?? ? ? ?// 判斷正負(fù)號 ?? ? ? ?if (str.charAt(i) == '-' || str.charAt(i) == '+') ?? ? ? ? ? ?sign = str.charAt(i++) == '-' ? -1 : 1; ?? ? ? ?// 索引有效數(shù)字字符 ?? ? ? ?while (i < str.length() && str.charAt(i) >= '0' && str.charAt(i) <= '9') { ?? ? ? ? ? ?// that statement is used to test if the num is bigger than INT_MAX after the str[i] is handled, if base > INT_MAX/10,? ?? ? ? ? ? ?// then base10+ str[i] -‘0’> base10>INT_MAX, or when base== INT_MAX/10, that means all the places are the same as INT_MAX except the ones place, so str[i]>‘7’ is needed.? ?? ? ? ? ? ?// 上面這段是LeetCode國外站對下面代碼的解釋。 ?? ? ? ? ? ?// 簡單來說就是 ?? ? ? ? ? ?// 如果`base > MAX_VALUE/10`,那么`base*10 + new_value` > `base*10` > `MAX_VALUE`。這個(gè)應(yīng)該很容易理解,這種情況下就會發(fā)生溢出。 ?? ? ? ? ? ?// 若`base == INT_MAX/10`,而且`new_value = str.charAt(i++) - '0'`大于`7`,也會發(fā)生溢出。因?yàn)?#96;MAX_VALUE = 2147483647` ?? ? ? ? ? ?if (base > Integer.MAX_VALUE / 10 || (base == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 7)) { ?? ? ? ? ? ? ? ?return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE; ?? ? ? ? ? ?} ?? ? ? ? ? ?// 計(jì)算轉(zhuǎn)換值,str.charAt(i++) - '0'可以把字符串轉(zhuǎn)換成數(shù)字 ?? ? ? ? ? ?base = 10 * base + (str.charAt(i++) - '0'); ?? ? ? ?} ?? ? ? ?// 計(jì)算結(jié)果值 ?? ? ? ?return base * sign; ?? ?} |
注意:判斷字符串的值是否超出32位有符號數(shù)的范圍的思路:
1.把字符串轉(zhuǎn)換成字符數(shù)組,然后依次獲取每個(gè)字符,定義一個(gè)起始值int為0的變量來代表獲取到的字符base,定義一個(gè)int為1的變量來代表字符的符號sign。判斷base是否大于整數(shù)的最大值除以10,或者判斷base如果=整數(shù)的最大值除以10,并且獲取到的當(dāng)前字符的值大于7,如果是,判斷base的符號,如果是“-”,則返回整數(shù)的最小值,否則返回整數(shù)的最大值;如果base的大小在32位整數(shù)范圍內(nèi),則返回base*sign;
總結(jié)
以上是生活随笔為你收集整理的从键盘获取字符串,并把字符串转数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。