🔬

MeasurementFormatterの単位表示観測隊

2023/05/02に公開

本日は MeasurementFormatterunitOptions を観測する。

おさらい

MeasurementMeasurementFormatter をおさらい。

Measurement

単位と数値を持つ。

Measurement(value: 数値, unit: 単位)

と書く

MeasurementFormatter

表示に関することを扱う。
言語/地域の情報を指定することが出来る。
本日観測する unitOptions はここに含まれる。

では観測を始める。

指定なしのデフォルト

unitOptions を指定するコードを書かない。

コード

let formatter = MeasurementFormatter()

var length1 = Measurement(
                value: 1500, unit: UnitLength.meters)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: length1))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: length1))

var length2 = Measurement(
                value: 0.0005, unit: UnitLength.meters)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: length2))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: length2))

結果

1500 .meters は

1.5 km //ja_JP
0.932 mi //en_US

0.0005 .meters は

0 km //ja_JP
0 mi //en_US

になった。
メートルで作成したのにキロやマイルで表示

naturalScale

コード

let formatter = MeasurementFormatter()
formatter.unitOptions = .naturalScale

var length1 = Measurement(
                value: 1500, unit: UnitLength.meters)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: length1))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: length1))

var length2 = Measurement(
                value: 15, unit: UnitLength.meters)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: length2))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: length2))

var length3 = Measurement(
                value: 0.0003, unit: UnitLength.meters)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: length3))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: length3))

結果

1500 .meters は

1.5 km //ja_JP
0.932 mi //en_US

15 .meters は

15 m //ja_JP
49.213 ft //en_US

0.0003 .meters は

0.3 mm //ja_JP
0.012 in //en_US

になった。
自動でkm、マイル、m、フィート、mm、inが変わる。ただしcmはなし。

providedUnit

コード

let formatter = MeasurementFormatter()
formatter.unitOptions = .providedUnit

var length1 = Measurement(
                value: 1500, unit: UnitLength.meters)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: length1))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: length1))

var length2 = Measurement(
                value: 0.0005, unit: UnitLength.meters)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: length2))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: length2))

結果

1500 .meters は

1,500 m
1,500 m

0.0005 .meters は

0 m
0 m

になった。
メートルで作ったのでメートルで表示

providedUnit convertあり

provided ってのが

  • インスタンスが作成されたときのことで、単位をコンバートしても不変
  • 単位をコンバートしたら変わる

のどっちなのか観測する。

コード

let formatter = MeasurementFormatter()
formatter.unitOptions = .providedUnit

var length1 = Measurement(
                value: 1500, unit: UnitLength.meters)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: length1))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: length1))

length1.convert(to: .millimeters)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: length1))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: length1))

結果

1500 .meters の作成後は

1,500 m
1,500 m

.millimeters へコンバートしたら

1,500,000 mm
1,500,000 mm

となった。
ミリにコンバートしたら表示もミリになった。

ちなみに

コンバートした新しいインスタンスを作成する converted もある。

let length2 = length1.converted(to: .millimeters)

temperatureWithoutUnit

単位を省いた温度ということだが、CやFを省いて丸だけで表示するアレである。

コード

let formatter = MeasurementFormatter()
formatter.unitOptions = .temperatureWithoutUnit

var hundred1 = Measurement(
                value: 100, unit: UnitTemperature.celsius)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: hundred1))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: hundred1))

var hundred2 = Measurement(
                value: 100, unit: UnitTemperature.fahrenheit)

formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: hundred2))
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: hundred2))

結果

摂氏100度で作成したものは

100°
100°

華氏100度で作成したものは

37.778°
37.778°

となる。
両方とも摂氏で表示している。

Discussion