0?o?O?你知道【八進制】喜歡哪一款嗎?你熟悉八進制與String的轉化嗎?

直接數值賦值

衆所周知,數值前不加0,所以八進制數的表示要求開頭加0,注意不是o或者O。
比如0123,直接賦值,對應的其實是十進制數83。

jshell> int a = 0123;
a ==> 83

來自字符串的轉型

但字符串的強制轉型則截然不同。
我們的數值串可能以0開頭,比如下面的串"0123":

jshell> String b = "0123";
b ==> "0123"

直接轉型,發現只是把0消去了而已,還是妥妥的十進制。
理由是:Integer.parseInt()默認十進制。

jshell> int c = Integer.parseInt(b);
c ==> 123

那怎麼轉八進制呢?顯然是加上radix參數的啦,參數值就是8。

jshell> int d = Integer.parseInt(b, 8);
d ==> 83

你以爲決定能轉成八進制是因爲b是"0123"?其實不是,任意數就可以,沒必要有先導0的:

jshell> b = "123";
b ==> "123"

jshell> int d = Integer.parseInt(b, 8);
d ==> 83

printf()輸出八進制

這個部分該使用%0還是%o呢?

先看看%0吧!

jshell> System.out.printf("%0", a);
|  異常錯誤 java.util.UnknownFormatConversionException:Conversion = '0'
|        at Formatter.checkText (Formatter.java:2732)
|        at Formatter.parse (Formatter.java:2718)
|        at Formatter.format (Formatter.java:2655)
|        at PrintStream.format (PrintStream.java:1053)
|        at PrintStream.printf (PrintStream.java:949)
|        at (#4:1)

明顯在扯皮……%0什麼鬼啊。。。

所以要用%o,打印出的結果就是八進制的啦!(%d是十進制整數)

jshell> System.out.printf("%o", a);
123$5 ==> java.io.PrintStream@65e2dbf3

jshell> System.out.printf("%o", c);
173$6 ==> java.io.PrintStream@65e2dbf3

jshell> System.out.printf("%d", a);
83$7 ==> java.io.PrintStream@65e2dbf3

大O行嗎?

jshell> System.out.printf("%O", c);
|  異常錯誤 java.util.UnknownFormatConversionException:Conversion = 'O'
|        at Formatter$FormatSpecifier.conversion (Formatter.java:2839)
|        at Formatter$FormatSpecifier.<init> (Formatter.java:2865)
|        at Formatter.parse (Formatter.java:2713)
|        at Formatter.format (Formatter.java:2655)
|        at PrintStream.format (PrintStream.java:1053)
|        at PrintStream.printf (PrintStream.java:949)
|        at (#7:1)

顯然不行啊!

八進制迴轉String

注意前面已經定義了a的值是0123,即83。
那麼同樣可以使用 Integer.toString() 中的radix來破解,radix置爲8即可。

jshell> String e = Integer.toString(a, 8);
e ==> "123"

結果不帶先導0。

總結

有關八進制的使用,大概可以這麼做一下歸納:

  • 八進制用的不多,不如二進制、十進制、十六進制廣泛。
  • 八進制直接賦值要加先導0,但顯示出來的還是十進制的值,底層還是二進制在運算,八進制沒實際意義。注意這裏不是o或者O,是0。
  • 八進制使用printf()打印的時候用的是"%o",不是O或者0。
  • 將String轉換成八進制數的時候,使用Integer.parseInt(),指明radix即可,結果還是十進制(顯示)/二進制(底層)表示的。注意String不必加先導0。
  • 八進制數轉成String的時候,使用逆向的Integer.toString(),指明radix即可,結果就是不帶先導0的八進制字符串表示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章