🍽️

parseXXX() の第二引数で、基数を指定できる件

2022/03/25に公開2

タイトルの通り。この事実を知らず、今日もまた無駄なコードを書いてしまったので、反省がてら記録として残しておく。

parseXXX() in Java

Javaでは、数字になり得る文字列を、parseXXX()というメソッドで様々な数字系の型に変換できる。シンタックスは以下のようになる。

  • static int parseInt(String s)
  • static double parseDouble(String s)
  • static long parseLong(String s)
int x = Integer.parseInt("10");       // 10
double y = Double.parseDouble("100"); // 100.0
long z = Long.parseLong("0");         // 0L

2nd argument in parseXXX()

今回私が初めて知ったのは、これらが第二引数を取り、そこではRadix(基数/base number)[1]が使えるということだ。

  • static int parseInt(String s, int radix)
  • static double parseDouble(String s, int radix)
  • static long parseLong(String s, int radix)

基数はX進数のX。2を指定すれば二進数だし、16を指定すれば16進数として、第一引数の文字列を変換してくれる。

実際のコードではこんな感じになる。第一引数の文字列が、第二引数の基数で変換できない場合はNumberFormatExceptionが投げられる。

long a = Long.parseLong("0", 10);            // 0L
long b = Long.parseLong("-FF", 16);          // -255L
long c = Long.parseLong("11001010", 2);      // 202L
try {
    long d = Long.parseLong("99", 8);        // NumberFormatException
} catch(NumberFormatException ex){
    ex.printStackTrace();
}

ちなみにこの第二引数を指定しないデフォルトの状態では、10(つまり、10進数)が指定されていることになる。

https://docs.oracle.com/javase/7/docs/api/java/lang/Long.html#parseLong(java.lang.String, int)

radix

radix(基数)は、他のメソッドでも度々登場する。

.toString()

public static String toString (int i, int radix)
第一引数に文字列、第二引数に基数を取る。文字列を基数ベースで変換し、Stringとして返す。

// return a string representation of the 1st argument 
// in the radix given by the 2nd arguments.
String intStrInBinary = Integer.toString(12345, 2); // "11000000111001"

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Integer.html#toString(int,int)

.valueOf()

public static String valueOf (String s, int radix)
第一引数にString型の文字列、第二引数に基数を取る。文字列を、基数ベースで解釈した結果を、Integer型のインスタンスとして返す。
ドキュメントにもあるが、中で何が行われているかと言えば、
new Integer(Integer.parseInt(s, radix))
というインスタンスを作って返しているとのこと。

// return an Integer object parsed with the radix given as the 2nd argument
Integer strInInt2 = Integer.valueOf("10010",2);     // 18
Integer strInInt8 = Integer.valueOf("12345",8);     // 5349
Integer strInInt10 = Integer.valueOf("12345", 10);  // 12345
Integer strInInt16 = Integer.valueOf("12345", 16);  // 74565

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Integer.html#valueOf(java.lang.String,int)

脚注
  1. radixはラテン語でrootという意味。radix : Java Glossary ↩︎

Discussion

TΛSKTΛSK

第2引数はregex(正規表現)ではなく、radix(基数)ですね。

aszasz

ご指摘いただき見直してみたら、確かにradixでしたね。記事も修正します。ありがとうございました。