溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java String轉(zhuǎn)int的寫(xiě)法是什么

發(fā)布時(shí)間:2021-10-28 17:55:37 來(lái)源:億速云 閱讀:187 作者:iii 欄目:編程語(yǔ)言

本篇內(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)&lsquo;-&rsquo;的話(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í)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI