検索

キーワード


【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

  • 公開日:2020-08-19 16:42:38
  • 最終更新日:2021-01-25 10:56:52
【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。

システムエンジニアとして駆け出したばかりですが、

初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。


プログラム初心者✅にも、プログラムに興味がある人✨も、

短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!

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(桁数)

文字数指定


より詳細な書式指示子の概要は、javadoc-Formatterを参照してください。

argument_index+$

’argument_index+$’ は、引数リスト内の引数の位置を表す要素です。

最初の引数は「1$」、2番目の引数は「2$」で参照されていきます。

省略すると、書式文字列内の書式指示子の順番と、引数リストの順番が対応するようになっています。


conversion(値の型)

大文字はそれぞれの小文字の概要と同じです。出力はString.toUpperCase()を呼び出したことになります。

conversionの書式の図

いつくかの異なるconversionを指定したformatメソッドの使い方を確認しましょう。

- 文字列(s,S)

public class Test {
	public static void main(String[] args) {

		String s = String.format("①[%1$s]②[%1$S]③[%2$s]④[%3$s]⑤[%4$s]",
				"format",12345,1234.5,null);
		System.out.println(s);
	}
}

出力結果

①[format]②[FORMAT]③[12345]④[1234.5]⑤[null]

- 数値(d,o,x,f)

浮動小数点は小数第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 2020


frags(出力形式)

frags書式

- 左寄せ/右寄せ

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を使って最大文字数や最小文字数を指定することができます。

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で使用できる代表的なエスケープシーケンスを確認しましょう。

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"	初心者から学べる
オンラインプログラミング学習
コーディネーターが案件探しのサポートや
疑問や相談に乗ります。


【著者】

新人SE・サトウ

読者を始め私自身も知りたい!と思うような知って得するプログラミング知識やIT情報を日々発信中です。
筆者の憧れの人物は、コリン・ファースさん、渡部篤郎さん。
教養のあるカッコいい大人になれるよう、プログラミングを始め興味関心を持ったことを毎日勉強しております !!

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様

【Java】よく使う日時クラス解説まとめ

【Java】よく使う日時クラス解説まとめ

こんにちは、駆け出しエンジニアの伊藤です。東京ITカレッジのJava研修で学んだ内容を復習も兼ねて記事にしたいと思います。今回は、日付時刻のまとめとして、日付時刻に関する基本的なクラスやメソッド等の概要を紹介していきます。より詳しく知りたい!という方は、リンク先の関連記事をご参考にしてください。Javaやプログラムについて勉強し始めた方の参考になれば幸いです!(eclipseを使用して計算を行って