本地化不同语言的数字整数

时间:2018-10-22 17:22:32

标签: swift numberformatter

我需要为不同的语言本地化数字整数(例如1、2、3等)。

就像阿拉伯语2一样٢

我使用数字格式化程序来实现这一点,对于某些语言来说似乎工作正常:

var n = 02;
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "ar")
formatter.numberStyle = .decimal

formatter.minimumIntegerDigits = 2
formatter.string(for: n);

这将给出正确的结果为“ ٠٢”

尽管我将语言更改为中文或日语。没用 对于中文,日语和许多其他语言,它仅打印02。

然后我进一步挖掘,发现替换这一行会将这些整数转换为中文:

formatter1.numberStyle = .spellOut

所以现在我的代码类似于

var n = 120;
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "zh_Hans_CN")
formatter.numberStyle = .spellOut

formatter.minimumIntegerDigits = 2
formatter.string(for: n);

它会打印“一百二十”,这正是我想要的。

但是问题是当我用英语使用此spellOut时,它会打印出“一,二”,如下面的代码所示:

var n = 120;
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en")
formatter.numberStyle = .spellOut

formatter.minimumIntegerDigits = 2
formatter.string(for: n);

它将打印“一百二十”而不是120。

我正在使用此代码将整数格式化为设备中设置的语言。 在上面的示例中,我已经对语言环境进行了硬编码,但是我为此使用了设备的语言,效果很好。

总之,问题在于如何将这些整数符号转换为设备当前语言的本机符号。

1 个答案:

答案 0 :(得分:2)

iOS不支持所有数字。您可以使用以下方法查看数字在所有受支持的本地语言中的表示方式:

Locale.availableIdentifiers.forEach {
    formatter.locale = Locale(identifier: $0)
    print($0, ":", formatter.string(for: 1234567890)!)
}

请记住,即使某些语言环境给出了某个数字系统,该应用程序的实际用户还是希望使用其他系统。

以下是在东亚语言环境中使用spellOut数字样式的一种方法:

let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "zh-Hans")
formatter.locale.regionCode

let spellOutLocales: Set = ["zh-Hant-TW",
                            "zh-Hant-MO",
                            "zh-Hant-HK",
                            "zh-Hant",
                            "zh-Hans-SG",
                            "zh-Hans-MO",
                            "zh-Hans",
                            "zh_Hant_HK",
                            "zh_Hans_CN",
                            "ja-JP",
                            "ko-KR",
                            "ko_KP",]

if spellOutLocales.contains(formatter.locale.identifier) {
    formatter.numberStyle = .spellOut
} else {
    formatter.numberStyle = .decimal
}

spellOutLocales并不详尽。

并像这样使用它:

let n = 1234567890
formatter.string(for: n) //"十二亿三千四百五十六万七千八百九十"

Here很好地解释了数字格式和国际化。


以下是使用Thai数字表示数字的示例:

let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "th_TH")
formatter.numberStyle = .decimal
let n = 1234567890
var str = formatter.string(for: n)! //"1,234,567,890" This is what the default formatter gives

let arabicNumerals = (0...9).map { String($0) }
let thaiNumerals = ["๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙",]
let zipped = zip(arabicNumerals, thaiNumerals)

let range = NSRange(location: 0, length: (str as NSString).length)

zipped.forEach { (arabic, thai) in
    let regex = try! NSRegularExpression(pattern: arabic, options: .caseInsensitive)
    str = regex.stringByReplacingMatches(in: str,
                                   options: .reportCompletion,
                                   range: range,
                                   withTemplate: thai)
}

print(str)  //๑,๒๓๔,๕๖๗,๘๙๐

我们在上面的代码中所做的是将出现的阿拉伯数字替换为相应的泰文数字。如果应在给定的语言环境中避免使用分组分隔符,则将formatter.usesGroupingSeparator设置为false