NumberFormatter
を使えばいいです。が、いくつか注意点があります。
//漢数字
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut
formatter.locale = .init(identifier: "ja-JP")
let number = 123456789012345678
if let string = formatter.string(from: NSNumber(value: number)){
print(string) //十二京三千四百五十六兆七千八百九十億千二百三十四万五千六百七十八
}
まずロケールを指定しないと.spellOut
に設定しても英語になります。
数値が負だった場合はしっかり「マイナス」と付けてくれるので安心です。
ただ、数値が「百京」を超えると変換してくれず、代わりに三桁区切りの数字が返ってくるようになります。
let numberA = Int(1E18)
let numberB = Int(1E18) - 1
if let string = formatter.string(from: NSNumber(value: numberA)){
print(string) //1,000,000,000,000,000,000
}
if let string = formatter.string(from: NSNumber(value: numberB)){
print(string) //九十九京九千九百九十九兆九千九百九十九億九千九百九十九万九千九百九十九
}
Int
のみを対象とするなら、実用的にはこのような関数を作っておく必要があると思います。
func toKansuji(from number: Int) -> String? {
if number >= Int(1E18){
return nil
}
if number <= -Int(1E18){
return nil
}
return formatter.string(from: NSNumber(value: number))
}