広告

Java : 文字列と数値の変換

文字列と数値の変換方法のまとめです。
10進数だけでなく16進数、2進数、0埋め、浮動小数点など、いろいろなパターンを具体例多めにご紹介します。


簡単なまとめ

本記事では、書式文字列には Java 15 で追加された String.formatted を使っています。
Java 15 より前のバージョンでは String.format をご使用ください。

// Java 15 以降
final String str1 = "%d".formatted(123);
System.out.println(str1); // "123"

// Java 15 より前
final String str2 = String.format("%d", 123);
System.out.println(str2); // "123"

整数

進数 変換 書式 使用例
10進数 文字列 → 数値
final int num = Integer.parseInt("1234");
System.out.println(num); // 1234
数値 → 文字列
final String str = Integer.toString(1234);
System.out.println(str); // "1234"
桁指定
final String str = "%7d".formatted(1234);
System.out.println(str); // "   1234"  (空白3つ)
0埋め
final String str = "%07d".formatted(1234);
System.out.println(str); // "0001234"
+記号あり
final String str = "%+d".formatted(1234);
System.out.println(str); // "+1234"
16進数 文字列 → 数値
final int num = Integer.parseInt("12ab", 16);
System.out.println(num); // 4779 (0x12ab)
数値 → 文字列
final String str = Integer.toHexString(0x12ab);
System.out.println(str); // "12ab"
桁指定
final String str = "%6x".formatted(0x12ab);
System.out.println(str); // "  12ab" (空白2つ)
0埋め
final String str = "%06x".formatted(0x12ab);
System.out.println(str); // "0012ab"
2進数 文字列 → 数値
final int num = Integer.parseInt("1111", 2);
System.out.println(num); // 15
数値 → 文字列
final String str = Integer.toBinaryString(0xf0);
System.out.println(str); // "11110000"

補足

  • 整数については int で解説していきます。
    int では Integerクラスを主に使いますが、short のときは Short、long のときは Long に置き換えていただければ対応可能です。
  • 16進数の変換については、Java 17 で追加された HexFormatクラスもあります。
    興味のある方はリンク先のコード例もご参照ください。

実数

変換 書式 使用例
文字列 → 数値 小数表記
final double num = Double.parseDouble("12.345");
System.out.println(num); // 12.345
浮動小数点表記
final double num = Double.parseDouble("1.2345e+5");
System.out.println(num); // 123450.0
数値 → 文字列
// 数値の大きさによって表記が変わります。
final String str1 = Double.toString(12.345);
System.out.println(str1); // "12.345"

final String str2 = Double.toString(123456789.0);
System.out.println(str2); // "1.23456789E8"
小数表記
final String str = "%f".formatted(1.234e-1);
System.out.println(str); // "0.123400"
桁指定(全体)
final String str = "%10f".formatted(0.1234);
System.out.println(str); // "  0.123400"  (空白2つ)
桁指定(小数部)
final String str = "%.3f".formatted(0.1234);
System.out.println(str); // "0.123"
浮動小数点表記
final String str = "%e".formatted(1234.0);
System.out.println(str); // "1.234000e+03"
桁指定(全体)
final String str = "%14e".formatted(1234.0);
System.out.println(str); // "  1.234000e+03"  (空白2つ)
桁指定(小数部)
final String str = "%.3e".formatted(1234.0);
System.out.println(str); // "1.234e+03"

補足

  • 実数については double で解説していきます。
    double には Doubleクラスを主に使いますが、float のときは Floatクラスに置き換えていただければ対応可能です。

整数(10進数)

文字列 → 数値

public static int parseInt​(String s) throws NumberFormatException
文字列の引数を符号付き10進数の整数型として構文解析します。

変換には Integer.parseInt​(String s) を使います。

// 基本形
final int value1 = Integer.parseInt("1234");
System.out.println(value1); // 1234

// プラス記号をつけてもOK
final int value2 = Integer.parseInt("+5678");
System.out.println(value2); // 5678

// マイナス記号をつけると負数になります。
final int value3 = Integer.parseInt("-1234");
System.out.println(value3); // -1234

// 先頭が0で埋まっていても解析してくれます。
final int value4 = Integer.parseInt("00001234");
System.out.println(value4); // 1234

int の範囲は Integer.MAX~Integer.MIN です。

System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648

変換元の文字列はこの範囲内におさまるようにしましょう。
範囲外になると非チェック例外の NumberFormatException が発生します。

// OK
final int value = Integer.parseInt("2147483647");
System.out.println(value); // 2147483647

// NumberFormatException が発生。
Integer.parseInt("2147483648");
// OK
final int value = Integer.parseInt("-2147483648");
System.out.println(value); // -2147483648

// NumberFormatException が発生。
Integer.parseInt("-2147483649");

10進数で許容されていない文字を使った場合も NumberFormatException が発生します。

// NumberFormatException が発生。
Integer.parseInt("xyz");

// NumberFormatException が発生。
Integer.parseInt("0x1234");

数値 → 文字列

基本形

public static String toString​(int i)
指定された整数を表すStringオブジェクトを返します。

Integer.toString(int i) を使って変換します。

final String str1 = Integer.toString(1234);
System.out.println(str1); // "1234"

final String str2 = Integer.toString(-5678);
System.out.println(str2); // "-5678"

桁を指定

public String formatted​(Object... args)
この文字列を書式文字列として使用し、指定された引数を書式設定します。

桁を指定するには書式文字列を使います。
書式文字列は "%桁数d" とします。

// 10桁で変換します。桁が足りない場合は空白で埋まります。
final String str1 = "%10d".formatted(1234);
System.out.println(str1); // "      1234"
System.out.println(str1.length()); // 10

// 8桁で変換します。マイナス記号も桁に含まれます。
final String str2 = "%8d".formatted(-5678);
System.out.println(str2); // "   -5678"
System.out.println(str2.length()); // 8

// 2桁を指定しています。しかし、数値は4桁になるので、そのまま4桁で変換されます。
// (切り捨てられたりはしません)
final String str3 = "%2d".formatted(1234);
System.out.println(str3); // "1234"
System.out.println(str3.length()); // 4

0埋め

桁を指定して足りない部分を0で埋めます。
書式文字列は "%0桁数d" とします。

// 10桁で変換します。桁が足りない場合は0で埋まります。
final String str1 = "%010d".formatted(1234);
System.out.println(str1); // "0000001234"

// 8桁で変換します。マイナス記号も桁に含まれます。
final String str2 = "%08d".formatted(-5678);
System.out.println(str2); // "-0005678"

プラス記号あり

常にプラスかマイナス記号をつけます。
書式文字列は "%+d" とします。

// 正数の場合にプラス記号をつけます。
final String str1 = "%+d".formatted(1234);
System.out.println(str1); // "+1234"

// 負数にはマイナス記号がつきます。
final String str2 = "%+d".formatted(-5678);
System.out.println(str2); // "-5678"

整数(16進数)

文字列 → 数値

public static int parseInt​(String s, int radix) throws NumberFormatException
2番目の引数に指定された基数をもとにして、文字列の引数を符号付き整数として構文解析します。

Integer.parseInt​(String s, int radix) を使って変換します。
基数(radix)に16を指定します。
文字列の最初に"0x"は不要です。つけると NumberFormatException が発生します。

// 基本形
final int value1 = Integer.parseInt("12ab", 16);
System.out.println(value1); // 4779
System.out.println(Integer.toHexString(value1)); // "12ab"

// プラス記号をつけてもOK
final int value2 = Integer.parseInt("+34ef", 16);
System.out.println(value2); // 13551
System.out.println(Integer.toHexString(value2)); // "34ef"

// マイナス記号をつけると負数になります。
final int value3 = Integer.parseInt("-12ab", 16);
System.out.println(value3); // -4779
// ※toHexStringは符号なし文字列に変換します。
System.out.println(Integer.toHexString(value3)); // "ffffed55"

// 先頭が0で埋まっていても解析してくれます。
final int value4 = Integer.parseInt("000012ab", 16);
System.out.println(value4); // 4779
System.out.println(Integer.toHexString(value4)); // "12ab"

// 先頭に"0x"は不要です。
// NumberFormatException が発生。
Integer.parseInt("0x12ab", 16);

public static Integer decode​(String nm) throws NumberFormatException
StringをIntegerにデコードします。

もしくは Integer.decode​(String nm) を使います。
こちらは、16進数以外にも10進数や8進数も解析できます。

// decodeの場合は先頭に"0x"が必要です。
final int value1 = Integer.decode("0x12ab");
System.out.println(value1); // 4779
System.out.println(Integer.toHexString(value1)); // "12ab"

// または"#"でもOKです。
final int value2 = Integer.decode("#12ab");
System.out.println(value2); // 4779
System.out.println(Integer.toHexString(value2)); // "12ab"

// プラス記号をつけてもOK
final int value3 = Integer.decode("+0x45cd");
System.out.println(value3); // 17869
System.out.println(Integer.toHexString(value3)); // "45cd"

// マイナス記号をつけると負数になります。
final int value4 = Integer.decode("-0x45cd");
System.out.println(value4); // -17869
// ※toHexStringは符号なし文字列に変換します。
System.out.println(Integer.toHexString(value4)); // "ffffba33"

// "0x"の後に0で埋まっていても解析してくれます。
final int value5 = Integer.decode("0x00000abc");
System.out.println(value5); // 2748
System.out.println(Integer.toHexString(value5)); // "abc"

数値 → 文字列

基本形

public static String toHexString​(int i)
整数引数の文字列表現を、基数16の符号なし整数として返します。

Integer.toHexString(int i) を使って変換します。
注意点としては、符号なし整数となることです。

// 基本形
final String str1 = Integer.toHexString(0x12ab);
System.out.println(str1); // "12ab"

// 大文字にしたい場合はString.toUpperCaseを使います。
System.out.println(str1.toUpperCase()); // "12AB"

// 負数は符号なしで変換されます。
final String str2 = Integer.toHexString(-0x12ab);
System.out.println(str2); // "ffffed55"

桁を指定

桁を指定するには書式文字列を使います。
書式文字列は "%桁数x" とします。

// 6桁で変換します。桁が足りない場合は空白で埋まります。
final String str1 = "%6x".formatted(0x12ab);
System.out.println(str1); // "  12ab"
System.out.println(str1.length()); // 6

// 書式文字列のxを大文字にすると結果も大文字になります。
final String str2 = "%6X".formatted(0x12ab);
System.out.println(str2); // "  12AB"
System.out.println(str2.length()); // 6

// 12桁で変換します。負数は符号なしとなります。
final String str3 = "%12x".formatted(-0x34cd);
System.out.println(str3); // "    ffffcb33"
System.out.println(str3.length()); // 12

// 2桁を指定しています。しかし、数値は4桁になるので、そのまま4桁で変換されます。
// (切り捨てられたりはしません)
final String str4 = "%2x".formatted(0x12ab);
System.out.println(str4); // "12ab"
System.out.println(str4.length()); // 4

0埋め

桁を指定して足りない部分を0で埋めます。
書式文字列は "%0桁数x" とします。

// 6桁で変換します。桁が足りない場合は0で埋まります。
final String str1 = "%06x".formatted(0x12ab);
System.out.println(str1); // "0012ab"

// 書式文字列のxを大文字にすると結果も大文字になります。
final String str2 = "%06X".formatted(0x12ab);
System.out.println(str2); // "0012AB"

// 12桁で変換します。負数は符号なしとなります。
final String str3 = "%012x".formatted(-0x34cd);
System.out.println(str3); // "0000ffffcb33"

使用できない書式

16進数では符号ありの書式文字列 "%+x" は使えません。

// FormatFlagsConversionMismatchException: Conversion = x, Flags = + が発生。
final String str1 = "%+x".formatted(0x12ab);

整数(2進数)

文字列 → 数値

public static int parseInt​(String s, int radix) throws NumberFormatException
2番目の引数に指定された基数をもとにして、文字列の引数を符号付き整数として構文解析します。

Integer.parseInt​(String s, int radix) を使って変換します。
基数(radix)に2を指定します。

// 基本形
final int value1 = Integer.parseInt("1110", 2);
System.out.println(value1); // 14
System.out.println(Integer.toBinaryString(value1)); // "1110"

// プラス記号をつけてもOK
final int value2 = Integer.parseInt("+1111", 2);
System.out.println(value2); // 15
System.out.println(Integer.toBinaryString(value2)); // "1111"

// マイナス記号をつけると負数になります。
final int value3 = Integer.parseInt("-1111", 2);
System.out.println(value3); // -15
// ※toBinaryStringは符号なし文字列に変換します。
System.out.println(Integer.toBinaryString(value3)); // "11111111111111111111111111110001"

// 先頭が0で埋まっていても解析してくれます。
final int value4 = Integer.parseInt("00001010", 2);
System.out.println(value4); // 10
System.out.println(Integer.toBinaryString(value4)); // "1010"

数値 → 文字列

public static String toBinaryString​(int i)
整数引数の文字列表現を、基数2の符号なし整数として返します。

Integer.toBinaryString​(int i) を使って変換します。
注意点としては、符号なし整数となることです。

// 基本形
final String str1 = Integer.toBinaryString(0x01);
System.out.println(str1); // "1"

final String str2 = Integer.toBinaryString(0x0f);
System.out.println(str2); // "1111"

final String str3 = Integer.toBinaryString(0xf0);
System.out.println(str3); // "11110000"

// 負数は符号なしとして表現されます。
final String str4 = Integer.toBinaryString(-0x0f);
System.out.println(str4); // "11111111111111111111111111110001"

使用できない書式

10進数、16進数で使えた書式文字列による変換は、2進数では使えません。

浮動小数点

文字列 → 数値

小数表記

public static double parseDouble(String s) throws NumberFormatException
DoubleクラスのvalueOfメソッドを実行した場合と同様に、指定されたStringが表す値に初期化された新しいdouble値を返します。

Double.parseDouble(String s) を使って変換します。

// 基本形
final double value1 = Double.parseDouble("12.345");
System.out.println(value1); // 12.345

// 整数部が0の場合は省略可能です。
final double value2 = Double.parseDouble(".123");
System.out.println(value2); // 0.123

// プラス記号をつけてもOK
final double value3 = Double.parseDouble("+12.067");
System.out.println(value3); // 12.067

// マイナス記号をつけてもOK
final double value4 = Double.parseDouble("-34.789");
System.out.println(value4); // -34.789

// 先頭が0で埋まっていても解析してくれます。
final double value5 = Double.parseDouble("0000012.345");
System.out.println(value5); // 12.345

特殊な値も変換できます。

// 非数
final double value1 = Double.parseDouble("NaN");
System.out.println(value1); // "NaN"

// プラス無限量
final double value2 = Double.parseDouble("Infinity");
System.out.println(value2); // "Infinity"

// マイナス無限量
final double value3 = Double.parseDouble("-Infinity");
System.out.println(value3); // "-Infinity"

浮動小数点表記

浮動小数点表記も Double.parseDouble(String s) を使って変換します。

final double value1 = Double.parseDouble("1.2345e+1");
System.out.println(value1); // 12.345

final double value2 = Double.parseDouble("1.2345e-2");
System.out.println(value2); // 0.012345

final double value3 = Double.parseDouble("123.45e+10");
System.out.println(value3); // 1.2345E12

数値 → 文字列

基本形

public static String toString(double d)
double引数の文字列表現を返します。

Double.toString​(double d) で変換します。

数値の絶対値がとても大きい(107以上)、もしくはとても小さい(10-3未満) 場合は、浮動小数点表記で変換されます。
それ以外は小数表記となります。

// 小数表記
final String str1 = Double.toString(12.345);
System.out.println(str1); // "12.345"

final String str2 = Double.toString(-34.567);
System.out.println(str2); // "-34.567"

// 浮動小数点表記
final String str3 = Double.toString(123456789);
System.out.println(str3); // "1.23456789E8"

final String str4 = Double.toString(0.0001234);
System.out.println(str4); // "1.234E-4"

小数表記

書式文字列 "%f" で変換します。
桁数が大きい場合でも必ず小数表記となります。

// デフォルトでは小数点以下を6桁で変換します。
final String str1 = "%f".formatted(12.345);
System.out.println(str1); // "12.345000"

final String str2 = "%f".formatted(1.234e+10);
System.out.println(str2); // "12340000000.000000"

final String str3 = "%f".formatted(1.234e-3);
System.out.println(str3); // "0.001234"

小数部の桁を指定するには、書式文字列 "%.桁数f" で変換します。(%の後ろにピリオドが入ります)

// 小数点以下を1桁に指定します。
final String str1 = "%.1f".formatted(1.2345);
System.out.println(str1); // "1.2"

// 小数点以下を2桁に指定します。
final String str2 = "%.2f".formatted(-1.2345);
System.out.println(str2); // "-1.23"

// 小数点以下を10桁に指定します。足りない分は0で埋まります。
final String str3 = "%.10f".formatted(1.234e-5);
System.out.println(str3); // "0.0000123400"

全体の桁を指定するには、書式文字列 "%全体桁数f" で変換します。
小数部の桁も合わせて指定する場合は "%全体桁数.小数部桁数f" とします。

// 全体の桁数を10桁に指定します。
// 小数点やマイナス記号といったものも含みます。
// 足りない分は空白で埋まります。
final String str1 = "%10f".formatted(-1.234);
System.out.println(str1); // " -1.234000"
System.out.println(str1.length()); // 10

// 全体の桁数を5桁で指定しています。
// しかし、小数部がデフォルトで6桁なので結果として5桁以上になります。
final String str2 = "%5f".formatted(1.234);
System.out.println(str2); // "1.234000"

// 小数部も指定します。
final String str3 = "%6.2f".formatted(1.234);
System.out.println(str3); // "  1.23"
System.out.println(str3.length()); // 6

浮動小数点表記

書式文字列 "%e" で変換します。
桁数が小さい場合でも必ず浮動小数点表記となります。

// デフォルトでは小数点以下を6桁で変換します。
final String str1 = "%e".formatted(1.2345);
System.out.println(str1); // "1.234500e+00"

final String str2 = "%e".formatted(-12345.0);
System.out.println(str2); // "-1.234500e+04"

final String str3 = "%e".formatted(1.234e-5);
System.out.println(str3); // "1.234000e-05"

// 大文字の"E"とすると結果も大文字になります。
final String str4 = "%E".formatted(1.234e-5);
System.out.println(str4); // "1.234000E-05"

小数部の桁を指定するには、書式文字列 "%.桁数e" で変換します。

// 小数点以下を1桁に指定します。
final String str1 = "%.1e".formatted(1.2345);
System.out.println(str1); // "1.2e+00"

// 小数点以下を2桁に指定します。
final String str2 = "%.2e".formatted(-1.2345);
System.out.println(str2); // "-1.23e+00"

// 小数点以下を10桁に指定します。
final String str3 = "%.10e".formatted(1.234e-5);
System.out.println(str3); // "1.2340000000e-05"

全体の桁を指定するには、書式文字列 "%全体桁数e" で変換します。
小数部の桁も合わせて指定する場合は "%全体桁数.小数部桁数e" とします。

// 全体の桁数を15桁に指定します。
// 小数点やマイナス記号といったものも含みます。
// 足りない分は空白で埋まります。
final String str1 = "%15e".formatted(-1.234);
System.out.println(str1); // "  -1.234000e+00"
System.out.println(str1.length()); // 15

// 全体の桁数を5桁で指定しています。
// しかし、小数部がデフォルトで6桁なので結果として5桁以上になります。
final String str2 = "%5e".formatted(1.234);
System.out.println(str2); // "1.234000e+00"
System.out.println(str2.length()); // 12

// 小数部も指定します。
final String str3 = "%10.2e".formatted(1.234);
System.out.println(str3); // "  1.23e+00"
System.out.println(str3.length()); // 10

関連記事

当サイト

公式API仕様

  • Formatter (Java SE 19 & JDK 19)
    • 書式文字列の公式API仕様です。
      本記事では浮動小数点表記は "%e" を紹介しましが、 "%g""%a" もあります。
      興味がありましたらリンク先をご参照ください。
ページの先頭へ