秒数→◯分◯秒 という表記への変換を DateComponentsFormatter で実現する

目次

DateComponentsFormatter を使うと、 秒数 を ◯分◯秒 という String に変換してくれます。 自前実装するより、端末の言語設定で Localize されるので活用していきたいところです。 ただ、この Object は locale を指定することができず、どうもアプリの Localization 設定と端末の言語設定が一致したときのみ反映されるようです。 基本的にアプリを作り始めたときは、English での Localization しかされていないような挙動なので、 日本語で使うような “◯ 分 ◯ 秒” を実現するにはその辺りをちょっと対応する必要があります。

環境

  • MacOS: 12.1
  • Xcode: Version 13.2.1 (13C100)
  • Swift: 5.5.2

◯ 分 ◯ 秒 という表記を DateComponentsFormatter で実現する方法

DateComponentsFormatter の 基本的な使い方

基本的な使い方は以下のようになります。 ただ、これだけだと 2 minutes, 15 seconds のような表記になります(日本語 Localization していない場合)。

fileprivate let dateComponentFormattter = createDateComponentsFormatter()

private func createDateComponentsFormatter() -> DateComponentsFormatter {
    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .full // .abbreviated, .positional
    formatter.allowedUnits = [.hour, .minute, .second]
    return formatter
}

func secondsToString(_ sec: Double) -> String {
    return dateComponentFormattter.string(from: TimeInterval(_sec)) ?? "?"
}

// print(secondsToString(135))
// -> 2分 15秒 にしたい

日本語 Localize を有効にする

Targets -> Info に 以下の項目を追加します。 一応これだけで「日本語 Localization 対応」という扱いになるようです。 後は端末の言語設定が日本語になっていれば、上記関数の挙動が変化します。

参考