【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