こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスformatメソッド引数の値を任意の書式に編集して、文字列内に置き換えることができるのがformatメソッドです。Formatter format(Locale l,書式文字列, Object...)Formatter format(書式文字列, Object... )書式指示子を含んだ文字列(書式文字列)を引数に指定します。指示子の構成によって任意の書式を指定します。書式指示子についての詳細は下記(目次参照)に掲載しています。まずはformatメソッドの使い方のイメージを掴みましょう。◆実装例import java.util.Formatter;
public class Test {
public static void main(String[] args) {
Formatter fm = new Formatter();
fm.format("HELLO %S", "format");
System.out.println(fm);
}
}◆出力結果HELLO FORMAT①java.langパッケージStringクラスに実装されているformatメソッド②java.ioパッケージPrintStreamクラスに実装されているformatメソッド③java.ioパッケージPrintWriterクラスに実装されているformatメソッド④System.out.printf()も内部ではFormatterクラスのインスタンスメソッドを呼び出しています。実は同じような文字列整形が可能です。String String.format(書式文字列, Object...)System.out.printf(書式文字列, Object...)◆①と④の実装例public class Test {
public static void main(String[] args) {
String s = String.format("GOOD %S", "format");
System.out.println(s);
System.out.printf("GREAT %S", "format");
}
}◆出力結果GOOD FORMAT
GREAT FORMAT本記事で紹介しているFormatメソッドは指示子の構成によって引数を任意の書式へ編集し文字列に組み込むことができる点でjava.textパッケージMessageFormatクラスに実装されているformatメソッドと異なります。参考リンク:【Java】MessageFormatクラスでの文字列置換★以下の説明からString.formatメソッドを使用して解説していきます。書式指示子の構成要素一般(文字、数値型など)の書式指示子では、次の構文が使用されます。% [argument_index+$] [flags] [width] [.precision] conversion書式指示子に指定されている書式を確認しましょう。今回は例として、全ての要素を使用したこちらの書式指示子を使います。[%1$08.2f]の書式指示子は、0埋め(flags)/最小文字数’8’(width)/小数第2位まで表示(precision)の書式が指定されています。引数リストの第一引数(1$)である’1234.5678’が、これらの指定書式に変換され、文字列整形されます。◆実装例public class Test {
public static void main(String[] args) {
String s = String.format("文字列整形:%1$08.2f", 1234.5678);
System.out.println(s);
}
}◆出力結果文字列整形:01234.57要素の書式と主な使い方前項の例のように値を任意の書式に変換して文字列整形することがformatメソッドでは可能になります。ここでは要素の書き方(書式)と主な使い方を紹介します。argument_index+$conversion(値の型)- 文字列- 数値- True&False- 日時/時刻frags(出力形式)- 左寄せ/右寄せ- カンマ区切り- 0埋めwidth(最小文字数)とprecision(桁数)浮動小数点は小数第6位までをデフォルトで表示します。public class Test {
public static void main(String[] args) {
String s = String.format("10進数[%1$d]8進数[%1$o]16進数[%1$x]浮動小数点[%2$f]",
12345,1.2345);
System.out.println(s);
}
}出力結果10進数[12345]8進数[30071]16進数[3039]浮動小数点[1.234500]- True&False(b,B)引数にnullが指定されている場合はfalseになります。public class Test {
public static void main(String[] args) {
String s = String.format("①[%1$b]②[%1$B]③[%2$B]④[%3$b]",true,false,null);
System.out.println(s);
}
}出力結果①[true]②[TRUE]③[FALSE]④[false]- 日付/時刻(t,T)日付/時刻を指定したい時は「%t」または「%T」が接頭辞になります。後に以下の書式を指定する必要があります。下記では日付時刻を文字列にフォーマットするformatメソッドの主な使い方を紹介しています。日付時刻に関して詳しく知りたい方はリンク先を参考にしてください。参考:【Java】日付取得(新API-Java8) 【Java】日付時刻(新API‐Java8) - 日時比較・日時演算 【Java】日付時刻(新API‐Java8) - フォーマット 【Java】日付時刻(新旧 API 相互変換) 【Java】日時取得(従来API)-java.util.Date, java.util.Calendar 【Java】日付時刻(従来のAPI) - 操作(計算、比較、フォーマット) 【Java】日付時刻のまとめimport java.time.LocalDate;
import java.util.Date;
public class Test {
public static void main(String[] args) {
//Dateクラスを使った日付時刻取得(旧API)
Date date = new Date();
String s = String.format("①%tY年/%ty年②%tm月③%td日/%te日"
+"%n"//行区切り文字
+"④%tB/%tb⑤%tA/%ta⑥%tj",
date,date,date,date,date,
date,date,date,date,date);
System.out.println(s);
//java.timeパッケージ日付時刻取得(DateAndTime API-Java8)
String t = String.format("1⃣%tY年/%ty年2⃣%tm月3⃣%td日/%te日"
+"%n"
+"4⃣%tB/%tb5⃣%tA/%ta6⃣%tj",
LocalDate.now(),LocalDate.now(),LocalDate.now(),
LocalDate.now(),LocalDate.now(),LocalDate.now(),
LocalDate.now(),LocalDate.now(),LocalDate.now(),
LocalDate.now());
System.out.println(t);
}
}出力結果①2020年/20年②08月③01日/1日
④8月/8月⑤土曜日/土⑥214日
1⃣2020年/20年2⃣08月3⃣01日/1日
4⃣8月/8月5⃣土曜日/土6⃣214日public class Test {
public static void main(String[] args) {
//Dateクラスを使った日付時刻取得(旧API)
Date date = new Date();
String s = String.format("①%tH時/%tI時②%tk時/%tl時③%tM分%tS秒%tL"
+"%n"//行区切り文字
+"④%tp",
date,date,date,date,date,
date,date,date,date,date);
System.out.println(s);
//java.timeパッケージ日付時刻取得(DateAndTime API-Java8)
String t = String.format("1⃣%tH時/%tI時2⃣%tk時/%tl時3⃣%tM分%tS秒%tL"
+"%n"
+"4⃣%tp",
LocalTime.now(),LocalTime.now(),LocalTime.now(),
LocalTime.now(),LocalTime.now(),LocalTime.now(),
LocalTime.now(),LocalTime.now(),LocalTime.now(),
LocalTime.now());
System.out.println(t);
}
}出力結果①16時/04時②16時/4時③35分09秒438
④午後
1⃣16時/04時2⃣16時/4時3⃣35分09秒564
4⃣午後import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZonedDateTime;
import java.util.Date;
public class Test {
public static void main(String[] args) {
//Dateクラスを使った日付時刻取得(旧API)
Date date = new Date();
String s = String.format("①%tR②%tT③%tr④%tD%n⑤%tF⑥%tc",
date,date,date,date,date,date);
System.out.println(s);
//java.timeパッケージ日付時刻取得(DateAndTime API-Java8)
String t = String.format("1⃣%tR2⃣%tT3⃣%tr4⃣%tD3%n5⃣%tF6⃣%tc",
LocalTime.now(),LocalTime.now(),LocalTime.now(),
LocalDate.now(),LocalDate.now(),ZonedDateTime.now());
System.out.println(t);
}
}出力結果①16:51②16:51:19③04:51:19 午後④08/17/20
⑤2020-08-17⑥月 8月 17 16:51:19 JST 2020
1⃣16:512⃣16:51:193⃣04:51:19 午後4⃣08/17/203
5⃣2020-08-176⃣月 8月 17 16:51:19 JST 2020frags(出力形式)- 左寄せ/右寄せflags指定とともにwidthを指定します。public class Test {
public static void main(String[] args) {
String s = String.format("左寄せ:文字[%1$-8S]数字[%2$-8d]/右寄せ:数字[%2$ 8d]",
"FORMAT",12345);
System.out.println(s);
}
}出力結果左寄せ:文字[FORMAT ]数字[12345 ]/右寄せ:数字[ 12345]- カンマ区切りflags「,」を指定するとロケール固有の区切り文字が追加されます、今回はロケール無指定(デフォルト)なので、千桁ごとに,(カンマ)が追加されます。public class Test {
public static void main(String[] args) {
String s = String.format("カンマ区切り:整数[%,d]浮動小数点[%,.3f]",
123456789,123456.789);
System.out.println(s);
}
}出力結果カンマ区切り:整数[123,456,789]浮動小数点[123,456.789]- 0埋めflags指定とともにwidthを指定します。public class Test {
public static void main(String[] args) {
String s = String.format("0埋め[%09d]",12345);
System.out.println(s);
}
}出力結果0埋め[000012345]width(最小文字数)とprecision(桁数)widthやprecisionを使って最大文字数や最小文字数を指定することができます。- 文字数指定浮動小数点は小数第6位までをデフォルトで表示します。小数第6位までを含めた最小文字数を指定します。public class Test {
public static void main(String[] args) {
String s = String.format("最小文字数指定:文字[%8S]整数[%8d]浮動小数点[%12f]",
"FORMAT",12345,1234.5);
System.out.println(s);
String t = String.format("最大文字数指定:文字[%.3S]浮動小数点[%.3f]",
"FORMAT",1.2345);
System.out.println(t);
}
}出力結果最小文字数指定:文字[ FORMAT]整数[ 12345]浮動小数点[ 1234.500000]
最大文字数指定:文字[FOR]浮動小数点[1.235]エスケープシーケンス本記事では、文字列内に特殊な文字を埋め込む点で「書式指示子」と知識が混在してしまいがちである「エスケープシーケンス」も一緒に紹介します!両者をしっかりと区別して覚えましょう!そもそもエスケープシーケンス【escape sequence】とは通常は表記できない特殊な文字を文字列の中に混在させるために規定された特殊な記号や組み合わせのこと。先頭にバックスラッシュ(『/』の左右反対記号)、または『\』マークをつける。CSVデータファイルなどを使用して改行文字をデータベースに取込む場合や改行文字をメッセージの一部として表示する場合に、エスケープシーケンス(エスケープ文字)を使用します。javaで使用できる代表的なエスケープシーケンスを確認しましょう。以下が主なエスケープ文字の使い方です。public class Test {
public static void main(String[] args) {
String s = "TOKYOITCOLLEGE初心者から学べる"
+ "オンラインプログラミング学習"
+ "コーディネーターが案件探しのサポートや"
+ "疑問や相談に乗ります。";
System.out.println(s);
String t = "\"TOKYO\tIT\tCOLLEGE\"\t初心者から学べる\n"
+ "オンラインプログラミング学習\r"
+ "コーディネーターが案件探しのサポートや\n"
+ "疑問や相談に乗ります。";
System.out.println(t);
}
}出力結果TOKYOITCOLLEGE初心者から学べるオンラインプログラミング学習コーディネーターが案件探しのサポートや疑問や相談に乗ります。
"TOKYO IT COLLEGE" 初心者から学べる
オンラインプログラミング学習
コーディネーターが案件探しのサポートや
疑問や相談に乗ります。