xyk blog

最近は iOS 開発の記事が多めです。

【Swift5】数値を3桁毎にカンマ区切りにした文字列にする

検証環境:
Xcode 11.3
Swift 5.1.3

数値や金額の表記で3桁毎にカンマ区切りにした文字列に変換する方法についてです。
String.localizedStringWithFormatメソッドを使う、またはNumberFormatterを使うと言った方法があります。

let million: Int = 1_000_000

do {
    // 1
    let result = String.localizedStringWithFormat("%d", million)
    print(result) // 1,000,000
}
do {
    // 2
    let f = NumberFormatter()
    f.numberStyle = .decimal
    f.groupingSeparator = "," // 区切り文字を指定
    f.groupingSize = 3 // 何桁ごとに区切り文字を入れるか指定
    
    let result = f.string(from: NSNumber(integerLiteral: million)) ?? "\(million)"
    print(result) // 1,000,000
}
do {
    // 3
    let f = NumberFormatter()
    f.numberStyle = .currency // 先頭に通貨記号が付与される。ロケールが日本なら¥記号
    f.groupingSeparator = ","
    f.groupingSize = 3
    
    let result = f.string(from: NSNumber(integerLiteral: million)) ?? "\(million)"
    print(result) // ¥1,000,000
}

Extension として追加

private let formatter: NumberFormatter = {
    let f = NumberFormatter()
    f.numberStyle = .decimal
    f.groupingSeparator = ","
    f.groupingSize = 3
    return f
}()

extension Int {
    var withComma: String {
        return formatter.string(from: NSNumber(integerLiteral: self)) ?? "\(self)"
    }
}

あるいはこちらの記事で紹介されているように予め style と locale を指定した Extension を用意するのもあり。

private let formatter = NumberFormatter()

extension Int {

    private func formattedString(style: NumberFormatter.Style, localeIdentifier: String) -> String {
        formatter.numberStyle = style
        formatter.locale = Locale(identifier: localeIdentifier)
        return formatter.string(from: NSNumber(integerLiteral: self)) ?? "\(self)"
    }

    // カンマ区切り
    var formattedJPString: String {
        return formattedString(style: .decimal, localeIdentifier: "ja_JP")
    }

    // 日本円表記
    var JPYString: String {
        return formattedString(style: .currency, localeIdentifier: "ja_JP")
    }
}

let million: Int = 1_000_000
million.formattedJPString   // 1,000,000
million.JPYString           // ¥1,000,000