Java Gold対策：フォーマット

# はじめに

本稿は、Java Goldの学習のまとめとしてフォーマットについてまとめる。

### フォーマットとは

Javaで扱うデータを表示箇所に応じて、
書式を変更したい場合に書式化するためのもの。

数値や、日付などでそれぞれフォーマットする
方法が異なるため、以下にそのフォーマットの
方法をまとめる。

## 数値のフォーマットで使用する主なクラス一覧

`java.text.NumberFormat`
`java.text.DecimalFormat`

### ■ java.text.NumberFormat

NumberFormatはnewすることが出来ないため、
staticメソッドによってオブジェクトを取得する。

NumberFormatの主なメソッドは以下

| メソッド | 内容 |
|:-:|:-:|
| static final NumberFormat getInstance() | デフォルトロケールに対応した数値formatオブジェクトを返却 |
| static final NumberFormat getInstance(Locale locale) | 引数に指定したロケールに対応した数値formatオブジェクトを返却 |
| static final getCurrencyInstance() | デフォルトロケールに対応した通貨formatオブジェクトを返却 |
| static final getCurrencyInstance() | 引数に指定したロケールに対応した通貨formatオブジェクトを返却 |
| Number parse(String string) throws ParseException | 引数で指定された文字列を数値として返却 |


**▼ 使用例**

`java.text.NumberFormat`

```java
// 出力結果：1,000
NumberFormat format = NumberFormat.getInstance();
System.out.println(format.format(1000));

// 出力結果：￥1,000
NumberFormat format = NumberFormat.getCurrencyInstance();
System.out.println(format.format(1000));

// 出力結果：1000
try {
	NumberFormat format = NumberFormat.getInstance(Locale.JAPAN);
	String numberStr    = "1000";
	Number value1       = format.parse(numberStr);
	System.out.println(value1);
} catch (ParseException e) {
	// 指定したロケールと異なる値（numberStr = "$1000"）を指定した場合
}
```


### ■ java.text.DecimalFormat

DecimalFormatは、NumberFormatと異なりnewでオブジェクトを取得する。
また、以下パターンを使用することで自由にフォーマットをすることが出来る。

| 記号 | 内容 |
|:-:|:-:|
| 0 | 数字（その桁に数値が無い場合は"0"を表示） |
| ♯ | 数字（その桁に数値が無い場合はブランク） |
| . | 数字桁区切り文字 |
| - | マイナス記号 |
| , | カンマ区切り |
| % | 100売してパーセントを表す |
| ¥u00a5 | 通貨記号 |

**▼ 使用例**

```java
// 出力：1,11111
DecimalFormat formatter = new DecimalFormat("#,#####");
System.out.println(formatter.format(111111));

// 出力：01,1111
DecimalFormat formatter = new DecimalFormat("00,0000");
System.out.println(formatter.format(11111));

// 出力：¥11,11,11
DecimalFormat formatter = new DecimalFormat("\u00a5##,##");
System.out.println(formatter.format(111111));

//　備考（0埋め）
// DecimalFormat型
// 出力：0100.00
DecimalFormat formatter = new DecimalFormat("####.##");
formatter.setMinimumFractionDigits(2);
formatter.setMaximumFractionDigits(4);
formatter.setMinimumIntegerDigits(4);
formatter.setMaximumIntegerDigits(6);
System.out.println(formatter.format(100));
```


## 日付のフォーマットで使用する主なクラス一覧

`java.time.format.DateTimeFormatter`

### ■ DateTimeFormatter

主に使用するメソッド一覧

| メソッド | 内容 |
|:-:|:-:|
| static DateTimeFormatter ofLocalizedDate(FormatStyle dateStyle) | 日付のフォーマット |
| static DateTimeFormatter ofLocalizedTime(FormatStyle timeStyle) | 時間のフォーマット |
| static DateTimeFormatter ofLocalizedDate(FormatStyle dateStyle) | 日付と時間のフォーマット |
| static DateTimeFormatter ofPattern(String pattern) | 引数に任意のパターン文字列を指定してフォーマッターを作成（パターンは以下に記載） |


パターン文字列一覧

| パターン | 内容 |
|:-:|:-:|
| G | 西暦  |
| y | 年  |
| M | 月  |
| d | 月の日  |
| E | 曜日  |
| a | 午前/午後  |
| h | 時間（12時表記）  |
| H | 時間（24時表記）  |
| m | 分  |
| s |  秒 |
| SS | ミリ秒  |
| x | タイムゾーン  |


```java
LocalDate date = LocalDate.of(2020, Month.JULY, 6);
LocalTime time = LocalTime.of(10, 20, 30);
LocalDateTime dateTime = LocalDateTime.of(date, time);

// 以下出力結果
// 2020/07/06
// 2020/07/06
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
System.out.println(formatter1.format(date));
System.out.println(formatter1.format(dateTime));

// 10:20:30
// dateをformatするとUnsupportedTemporalTypeException
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM);
System.out.println(formatter2.format(time));

// 10:20
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("hh:mm");
System.out.println(formatter3.format(time));
```

※　FormatStyleについては[こちら](https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/FormatStyle.html)を参照