上一篇提到 PrintStream.printf 只能輸出8, 10, 16三種進位格式,2進位該怎麼處理呢?Integer 類別裡有提供完整的方法,將數值在這四種進位和字串間轉換。
package idv.jacky.ironman4.day11;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Day11Example1 {
public static void main(String[] args) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while(true) {
try {
System.out.print("請輸入一個十進位數字:");
String number = in.readLine();
int integer = Integer.parseInt(number);
System.out.printf("%s 的 2進位是 %s %n", number, Integer.toBinaryString(integer));
System.out.printf("%s 的 8進位是 %s %n", number, Integer.toOctalString(integer));
System.out.printf("%s 的16進位是 %s %n%n", number, Integer.toHexString(integer));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
從上面的程式碼裡你可以看到,我們從命令列中讀取使用者所輸入的一個數字字串(第15行),然後使用 Integer.parseInt 的方法(第16行),轉成 int 型態。如果轉換失敗,例如不是標準的數字格式,這個方法會丟出 NumberFormatException 。接著,程式分別在第18,19和20行,分別使用 Integer.toBinaryString,Integer.toOctalString 和 Integer.toHexString 來將 int 型別的數值,轉換成2,8,16進位的字串。
其實我們還可以讓程式更聰明一點,Integer.parseInt 有另外一個覆寫的方法,除了原本第一個數字字串外,還有第二個j數參數,所傳入的是這個字串是用什麼進位所表示的。如果要使用這個方法,我們必需先知道所輸入的字串數字是什麼進位。之前提到過,在 Java 程式碼為如果要表示2進位,則前面必需加上 0b,8進位要加上0,而16進位要加上0x。我們可以利用這個條件來判斷所輸入的字串,到底是什麼進位的數字字串。
package idv.jacky.ironman4.day11;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Day11Example2 {
public static void main(String[] args) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while(true) {
try {
System.out.print("請輸入一個數字:");
String number = in.readLine();
int radix = checkRadix(number);
if (radix == 0) {
System.out.println("你所輸入數字的格式不正確!");
continue;
} else {
//去掉前面的表示符號
if (radix == 2 || radix == 16)
number = number.substring(2);
int integer = Integer.parseInt(number, radix);
System.out.printf("%s 的 2進位是 %s %n", number, Integer.toBinaryString(integer));
System.out.printf("%s 的 8進位是 %s %n", number, Integer.toOctalString(integer));
System.out.printf("%s 的10進位是 %s %n", number, Integer.toString(integer));
System.out.printf("%s 的16進位是 %s %n%n", number, Integer.toHexString(integer));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static int checkRadix(String number) {
number = number.toLowerCase();
if (number.startsWith("0x"))
return 16;
else if (number.startsWith("0")) {
if (number.startsWith("0b"))
return 2;
else
return 8;
} else {
try {
Integer.parseInt(number);
return 10;
} catch (NumberFormatException e) {
return 0;
}
}
}
}
上面的程式碼裡,我們寫了一個 checkRadix 的方法,判斷的方式就是我們剛剛提到的。如果無法判斷,就回傳 0,要使用者重新輸入。這樣程式是不是更完整了呢?
jackychu提到:
個數字字串(第15行),然後使用 Integer.parseInt 的方法(第16行),轉成 int 型態。如果轉換失敗,例如不是標準的數字格式,這個方法會丟出 NumberFormatException 。接著,程式分別在第18,19和20行,分別使用 Integer.toBi...(恕刪)
謝謝大大的分享,照亮我們這些java苦手。
謝謝支持~~ 記得按讚喔