您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Java String轉(zhuǎn)int的寫(xiě)法是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java String轉(zhuǎn)int的寫(xiě)法是什么”吧!
在 Java 中,String(字符串) 和 int(整形) 是兩種不同的數(shù)據(jù)類(lèi)型,字符串可以把許多字符串起來(lái),整形嘛——就是整形了。
(同學(xué)們可能會(huì)疑惑,這個(gè)知識(shí)點(diǎn)我能不知道,別蒙我好不好?繼續(xù)往下看唄。吃大餐之前,還能不來(lái)點(diǎn)小吃或者涼菜?)
有時(shí)候,字符串可以單純包含一些數(shù)字,比如說(shuō)“123”。大家應(yīng)該都見(jiàn)過(guò),當(dāng)一些操作需要你輸入手機(jī)驗(yàn)證碼的時(shí)候,大部分要求輸入的都是 6 位或者 4 位的隨機(jī)數(shù)字,它們傳遞到服務(wù)器端的時(shí)候,最初的形式都是字符串類(lèi)型的,然后可能再轉(zhuǎn)成整形做一些處理。
對(duì)于 Java 來(lái)說(shuō),不能直接通過(guò)“+”操作符來(lái)使兩個(gè)字符串類(lèi)型的數(shù)字相加,來(lái)看下面的例子。
String a = "100"; String b = "50"; String c = a+b; System.out.println(c);
程序輸出的結(jié)果是 10050,而不是 150。對(duì)于字符串來(lái)說(shuō),“+”操作符是用來(lái)串聯(lián)的,而不是用來(lái)相加的。
(同學(xué)們可能又要催了,這個(gè)知識(shí)點(diǎn)我也知道啊!馬上馬上,重點(diǎn)馬上就來(lái)。)
那就有必要先把字符串轉(zhuǎn)成整形再來(lái)做運(yùn)算了,常見(jiàn)的做法有兩種:
第一種,使用 Integer.valueOf(),它將返回一個(gè)包裝器類(lèi)型 Integer,當(dāng)然可以通過(guò)自動(dòng)拆箱的方式將其轉(zhuǎn)成 int 類(lèi)型。
String a = "100"; String b= "50"; int A = Integer.valueOf(a); int B = Integer.valueOf(b); int c = A+B; System.out.println(c);
程序輸出結(jié)果如下所示:
150
第二種,使用 Integer.parseInt(),它將返回一個(gè)基本數(shù)據(jù)類(lèi)型 int。
String a = "100"; String b= "50"; int A = Integer.parseInt(a); int B = Integer.parseInt(b); int c = A+B; System.out.println(c);
程序輸出結(jié)果如下所示:
150
這兩種方式,優(yōu)先推薦第二種,因?yàn)椴簧婕暗阶詣?dòng)拆箱,性能更佳。
(同學(xué)們可能急不可耐了,就這?好了,現(xiàn)在重點(diǎn)真的來(lái)了)
那除了上面這兩種方式,同學(xué)們還能想到第三種嗎?把字符串轉(zhuǎn)成整形。是不是突然感覺(jué)腦袋里有點(diǎn)空?
空就對(duì)了,本篇文章最漲見(jiàn)識(shí)的時(shí)候,它來(lái)了!步履蹣跚地來(lái)了!
/** * @author 沉默王二,一枚有趣的程序員 */ public class String2IntDemo { public static void main(String[] args) { String a = "100"; String b = "50"; int A = string2int(a); int B = string2int(b); int c = A + B; System.out.println(c); } public static int string2int(String s) { int num = 0; int pos = 1; for (int i = s.length() - 1; i >= 0; i--) { num += (s.charAt(i) - '0') * pos; pos *= 10; } return num; } }
這段程序輸出的結(jié)果同樣是 150。那眼睛雪亮的同學(xué)可能就發(fā)現(xiàn)了,string2int()方法到底是個(gè)什么樣的神奇方法,還有把字符串轉(zhuǎn)成整形的功效?
首先,必須得普及一點(diǎn)常識(shí),同學(xué)們需要對(duì) ASCII 碼有一點(diǎn)了解,就是所有的字符都有識(shí)別它們的代碼——這代碼就是 ASCII 碼。
基于這一點(diǎn),所有數(shù)字型的字符減去字符‘0’,將會(huì)得到該字符的絕對(duì)值,是一個(gè)整數(shù)。
String s = "520"; System.out.println(s.charAt(2) - '0'); System.out.println(s.charAt(1) - '0'); System.out.println(s.charAt(0) - '0');
輸出結(jié)果如下所示:
0 2 5
字符串“520”的長(zhǎng)度為 3,也就是說(shuō),下標(biāo)為 2 的位置是字符‘0’——數(shù)字 520 的個(gè)位數(shù);下標(biāo)為 1 的位置是字符‘2’——數(shù)字 520 的十位數(shù);下標(biāo)為 0 的位置是字符‘5’——數(shù)字 520 的百位數(shù)。
那有些機(jī)靈點(diǎn)的同學(xué)可能就想到了,通過(guò)一個(gè) for 循環(huán),遍歷一下字符串,然后計(jì)算出當(dāng)前位置上的整數(shù)值,個(gè)位數(shù)乘以 1,十位數(shù)乘以 10,百位數(shù)乘以 100,然后再加起來(lái),就是字符串對(duì)應(yīng)的整數(shù)值了。
沒(méi)錯(cuò),沒(méi)錯(cuò),string2int() 方法就是這么做的,如果參數(shù)是字符串“520”,那返回的結(jié)果就是整形 520;如果參數(shù)是字符串“100”,那返回的結(jié)果就是整形 100;如果參數(shù)是字符串“50”,那返回的結(jié)果就是整形 50。
如果你是一名有追求的程序員,那么對(duì)于 Integer.valueOf() 和Integer.parseInt() 都不會(huì)太滿(mǎn)意,因?yàn)檫@只是拿別人的輪子來(lái)用。而自定義方法 string2int() 就屬于從頭到尾的造輪子了。一想到這,是不是感覺(jué)自己開(kāi)始變牛逼了?
其實(shí),如果你肯扒拉源碼的話(huà),就會(huì)恍然大悟。
先來(lái)看 Integer.valueOf() 方法:
public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10)); }
內(nèi)部調(diào)用的其實(shí)就是 int parseInt(String s, int radix) 方法。
再來(lái)看 Integer.parseInt() 方法:
public static int parseInt(String s) throws NumberFormatException { return parseInt(s,10); }
內(nèi)部調(diào)用的也是 int parseInt(String s, int radix) 方法,基數(shù) radix 參數(shù)都是 10——同學(xué)們是不是猜到了什么?
對(duì),你猜的八九不離十,再來(lái)看一下 int parseInt(String s, int radix) 方法的源碼:
public static int parseInt(String s, int radix) throws NumberFormatException { /* * WARNING: This method may be invoked early during VM initialization * before IntegerCache is initialized. Care must be taken to not use * the valueOf method. */ if (s == null) { throw new NumberFormatException("null"); } if (radix < Character.MIN_RADIX) { throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX"); } if (radix > Character.MAX_RADIX) { throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX"); } boolean negative = false; int i = 0, len = s.length(); int limit = -Integer.MAX_VALUE; if (len > 0) { char firstChar = s.charAt(0); if (firstChar < '0') { // Possible leading "+" or "-" if (firstChar == '-') { negative = true; limit = Integer.MIN_VALUE; } else if (firstChar != '+') { throw NumberFormatException.forInputString(s, radix); } if (len == 1) { // Cannot have lone "+" or "-" throw NumberFormatException.forInputString(s, radix); } i++; } int multmin = limit / radix; int result = 0; while (i < len) { // Accumulating negatively avoids surprises near MAX_VALUE int digit = Character.digit(s.charAt(i++), radix); if (digit < 0 || result < multmin) { throw NumberFormatException.forInputString(s, radix); } result *= radix; if (result < limit + digit) { throw NumberFormatException.forInputString(s, radix); } result -= digit; } return negative ? result : -result; } else { throw NumberFormatException.forInputString(s, radix); } }
1)parseInt() 方法判斷了 null 的情況,認(rèn)為格式不正確。
2)然后判斷了基數(shù) radix 的情況,不能小于 2,不能大于 36。
3)if (len > 0) 判斷了字符串長(zhǎng)度的情況,如果為空“”,也認(rèn)為格式不正確。
4)再然后判斷首個(gè)字符 s.charAt(0),如果是負(fù)號(hào)“-”則認(rèn)為當(dāng)前字符串是一個(gè)負(fù)數(shù);如果不是正號(hào)“+”,則認(rèn)為格式不正確;如果只有一個(gè)負(fù)號(hào)或者正號(hào),也認(rèn)為格式不正確。
總之,就是比我們的自定義方法 string2int() 更嚴(yán)謹(jǐn)。
5)使用 while 循環(huán),配合更專(zhuān)業(yè)的 Character.digit(s.charAt(i++), radix) 計(jì)算出每個(gè)位置上字符對(duì)應(yīng)的數(shù)值,然后和基數(shù) radix 進(jìn)行相乘后使用累減的方式計(jì)算出最后的數(shù)值。
和 string2int() 有點(diǎn)不同,但整體上思路是一致的。
我們也可以對(duì) string2int() 方法再完善一下,使其滿(mǎn)足負(fù)數(shù)的情況:
public class S2IDemo { public static void main(String[] args) { String a = "-100"; String b = "50"; int A = string2int(a); int B = string2int(b); int c = A + B; System.out.println(c); } public static int string2int(String s) { boolean negative = false; char firstChar = s.charAt(0); if (firstChar == '-') { negative = true; s = s.substring(1); } int num = 0; int pos = 1; for (int i = s.length() - 1; i >= 0; i--) { num += (s.charAt(i) - '0') * pos; pos *= 10; } return negative ? -num : num; } }
當(dāng)首個(gè)字符為負(fù)號(hào)‘-’的話(huà),結(jié)果就返回負(fù)數(shù),并且把原來(lái)的字符串截取掉第一位。其他不變,這時(shí)候,當(dāng) a 為“-100”,b 為“50”的時(shí)候,a + b 的結(jié)果就是 -50。
到此,相信大家對(duì)“Java String轉(zhuǎn)int的寫(xiě)法是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。