HOWTO · Java
如何在 Java 中獲取整型數的各位數字
本文解釋得到整數的每一位數字的分離方法,並附有例項。
本頁內容
若要依原順序列印正整數 int 的各位數,可以使用 % 和 / 逐位取出,或先將數字轉成字串,再檢視其中的字元。本指南會以 12223 為例,介紹這兩種方法及另一種遞迴做法。程式碼與輸出區塊會保留原文;其中若有英文標籤,仍會以英文呈現。
使用 % (mod) 取得整數的餘數
對正整數而言,% 10 會得到最右邊的數字,而 / 10 會移除該數字。因此,取出數字的順序會由右至左。將每次取得的餘數存入 LinkedList 堆疊,再依序取出,就能按原本的順序列印。此範例適用於正的 int;零和負數需要另外處理。
剩餘值變成零時,迴圈就會停止。因此,輸入零時串列會保持空白,不會列印任何數字。如果零是有效輸入,請加入特別處理,直接列印 0。Java 對負數求餘時,結果本身也可能是負數,所以這個迴圈並不適用於所有正負整數。你可以先記錄正負號,再處理絕對值,但要留意 Integer.MIN_VALUE 的正值無法用 int 表示。如果 int 輸入可能包含這個值,請使用 long 儲存絕對值,或改用字串處理。當你需要直接取得數字值(例如將各位數相加)時,這種算術方法很實用。
執行此範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
int number = 12223;
LinkedList<Integer> digits = new LinkedList<>();
while (number > 0) {
digits.push(number % 10);
number /= 10;
}
while (digits.size() > 0) {
System.out.println(digits.pop());
}
}
}
1
2
2
2
3
使用 String.toCharArray() 取得字元陣列
先將整數轉成字串,再呼叫 toCharArray(),即可取得每個數字對應的字元。像 '2' 這樣的 char 是字元,不是數值 2;若計算需要整數形式的數字,請使用 Character.digit。此範例只處理正數,因此產生的陣列只包含數字。
這種做法會保留輸入數字顯示時的順序,也很容易延伸用於驗證或格式化。若要進行數值運算,Character.digit(digit, 10) 會將每個十進位數字字元轉成對應的整數值;如果來源可能含有非數字字元,請檢查回傳值是否為負數。負整數轉成字串時,第一個字元會是 '-',因此請略過或另行處理正負號,不要把它當成數字。零會轉成單一字元的字串 "0",所以這種方法會自然保留零這一位。由於 int 的範圍有限,這裡轉換的是該值完整的十進位表示,而不是較大型數值型別中的數字,也無法保留輸入字串原有的前置零。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
public class Main {
public static void main(String[] args) {
int number = 12223;
char[] digits = String.valueOf(number).toCharArray();
for (char digit : digits) {
System.out.println(Character.digit(digit, 10));
}
}
}
1
2
2
2
3
使用 number.split("(?<=.)") 將字串拆成字串陣列
String.split 會回傳字串陣列。正規表示式 (?<=.) 會比對緊接在字元之後的位置,因此正整數字串會被拆成每個數字各自一個字串。若數字含有負號,負號也會成為陣列中的一個元素;若需要的是字元而非字串,通常使用 toCharArray() 會更簡單。
陣列中的每個元素仍是文字,只有後續計算需要整數值時才需要解析。轉成字串也代表零會得到 "0",而負數會先有一個負號元素,再接著各位數;解析數字前請先排除負號。如果其他處理步驟本來就需要字串,這個寫法會很方便;但對單純走訪字元而言,它會增加正規表示式和陣列的額外成本,沒有比 toCharArray() 更有優勢。和其他整數轉字串的方法一樣,它只能看到數值本身的表示形式,無法還原原本 int 值中不存在的前置零。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
public class Main {
public static void main(String[] args) {
int number1 = 12223;
String number = String.valueOf(number1);
String[] digits = number.split("(?<=.)");
for (String digit : digits) {
System.out.println(digit);
}
}
}
1
2
2
2
3
使用遞迴拆分整數的各位數
持續將正整數除以 10,直到結果變成零。等遞迴呼叫返回後,再列印每次取得的餘數;如此一來,最左邊的數字會先列印。此版本在輸入零時不會列印任何內容,也不會處理負數;如果你的應用程式允許這些輸入,請明確加入對應的處理方式。
停止條件就是基本情況:除法結果變成零後,呼叫會直接返回;尚未結束的呼叫接著在遞迴逐層返回時列印先前保存的餘數。呼叫堆疊因此能反轉取出數字的順序,不需要另外建立集合。輸入零時,方法一開始就不符合遞迴條件,因此請直接加入列印零的處理。輸入負數時,請先處理並列印正負號,再以安全的數值繼續遞迴;若允許所有 int 值,也要考慮 Integer.MIN_VALUE。遞迴很適合用短整數作為教學範例;實際應用通常較容易擴充迴圈,而且不會為每一位數占用一個堆疊框架。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
public class Main {
public static void main(String[] args) {
recursion(12223);
}
public static void recursion(int number) {
if (number > 0) {
recursion(number / 10);
System.out.println(number % 10);
}
}
}
1
2
2
2
3