数字を出力する処理などでは、あらかじめ決められた桁数になるまで、数値の左側に0を埋め
る「ゼロ埋め」をすることがよくあります。
この記事では、Java でゼロ埋め処理をする方法を解説していきます。
ゼロ埋めとは
「ゼロ埋め」は、指定した桁数になるまで数値の左側にゼロを挿入する処理で、「ゼロパディング」と呼ぶこともあります。
例えば「109」という数字を、5桁になるようにゼロ埋めすると「00109」となります。
ゼロ埋めをやってみよう
さっそく、Java でゼロ埋めを行う処理を書いてみましょう。ゼロ埋めを行うには format メソッドを用います。fotmat メソッドの引数の1つ目には書式文字列を、2目の引数には書式化する値を指定します。
次のサンプルコードは、数値の「100」を全部で 6桁になるまで左側にゼロ埋めする例です。
public class Main {
public static void main(String[] args) throws InterruptedException {
int a = 100;
System.out.println(String.format("%06d", a));
}
}
■実行結果
000100
format メソッドの構文
上の例で引数の1つ目に %06d のような値を指定しましたが、このような形式を書式文字列と呼びます。String クラスの format メソッドでは、この書式文字列を指定することを、ゼロ埋め以外にもさまざまな文字列の書式編集を行えます。
書式文字列は「固定テキスト」と %から始まる「書式指示子」の大きく2つの要素で構成されます。
固定テキスト
「固定テキスト」はその名の通り、固定の文字を出力するもので、書式文字列に指定した文字が、そのまま format メソッドの結果として出力されます。
public class Main {
public static void main(String[] args) throws InterruptedException {
System.out.println(String.format("ここは固定テキストです"));
}
}
■実行結果
ここは固定テキストです
書式指示子
先ほどゼロ埋めのサンプルコードでも使った「書式指示子」は、 % から始まる文字列で、%[インデックス$][フラグ][幅][.精度]型 の順に書式を指定し、[](角括弧 )の要素については指定を省略できます。
各書式の要素で指定する内容の詳細は次のとおりです。
■ インデックス
インデックスは、引数リスト内での引数の位置を1$, 2$, 3$, … の順に指定していきます。
例えば次の例では、書式文字列に “%2$s %1$s” と指定しているため、引数リストの逆の順番で書式指示子が割り当てられた文字列が生成されています。
String outStr = String.format("%2$s %1$s", "引数1", "引数2");
System.out.println(outStr); //-> 引数2 引数1
■ フラグ
フラグは出力形式を指定します。指定する形式は型によって異なります。
- –:結果は左揃えになります。
- +:数値の場合のみ使用可能。結果に常に符号が含まれます。
- ‘ ‘:正の値を示す空白が含まれます。
- 0:幅で指定した桁数になるまでゼロが追加されます。(ゼロ埋め)
- ,:ロケール固有のグループ化区切り文字を含む(3桁ごとのカンマ区切り)
- (:マイナスの数値の場合、数値を括弧で囲みます。
いくつかフラグの例を見てみましょう。
//結果の左寄せ・右寄せ
System.out.println(String.format("%-5s", "A")); //-> "A "
System.out.println(String.format("%5s", "A")); //-> " A"
//カンマ区切り
System.out.println(String.format("%,d", 10000)); //-> "10,000"
■ 幅
出力する最小文字数を指定します。%05などのように指定することで、5桁になるまで前にゼロを挿入する、いわゆるゼロ埋めを行います。
■ 精度
小数点以下の桁数(浮動小数点数)を指定します。
■ 型
引数リストで指定する値の型を指定します。 書式指示子で指定できる型は多くありますが、代表的な型としては次のようなものがあります。
- h, H:引数のハッシュコードを16進数に変換した値
- s, S:文字列の値
- c, C:Unicode文字の値
- d;10進数の整数値
- o;8進数の整数
- x, X;16進数の整数
- e, E:浮動小数点表示形式の10進数の値
- f :10進数の小数値
ゼロサプレス(前ゼロの削除)
逆に、ゼロ埋めで付けた先頭の「0」を削除するゼロサプレスの方法も見てみましょう。
ゼロサプレスとは、「00100」のような文字列から前のゼロを取り除いて「100」にする処理です。
ゼロサプレスは、format のような決まった巻数はなく、正規表現を使ってゼロを取り除く方法や、一度数値に変換してからゼロ埋めなして文字列化したりする方法があります。
それぞれ、サンプルコードを作ってみましょう。
正規表現でゼロサプレス
正規表現でゼロサプレスをする場合は次のようなコードになるでしょう。
^0+([0-9]+.*) の正規表現で、先頭から続くゼロをマッチングさせ、それ以降のゼロ以外の数値をグループ化することで、前のゼロのみを取り除いた数字を取り出すことができます。
import java.util.regex.*;
public class Main {
public static void main(String[] args) throws InterruptedException {
String str = "002021";
Pattern p = Pattern.compile("^0+([0-9]+.*)");
Matcher m = p.matcher(str);
if (m.matches()) {
System.out.println(m.group(1));
}
}
}
■ 実行結果
2021
1度数値に変換する
もう一つの方法として、前ゼロが付いた文字列を1度数値に変換してから、再度文字列に変換することでもゼロサプレスできます。
public class Main { public static void main(String[] args) throws Exception { String str = "002021"; int intValue = Integer.parseInt(str); //文字列を数値に変換 String outStr = String.valueOf(intValue); //数値をもう一度文字列に変換 System.out.println(outStr); }}
■ 実行結果
2021
まとめ
数値のゼロ埋めなどで使用する format 関数と、ゼロ埋めした文字列から逆にゼロを取り除くゼロサプレスの処理について解説してきました。
数値のゼロ埋め(ゼロパディング)は、数値の桁数を揃えるシーンで多く使われるため、是非覚えておきましょう。
【関連記事】
▶【Java】printfメソッドで書式を指定して値を出力する方法
インデックスを省略した場合は、書式識別子が出現した順番に、引数リストの値が割り当てられていきます。