1

我需要为不同语言本地化数字整数(如 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);

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

但问题是,当我将这个拼写与英语一起使用时,它会打印一,二,如下代码所示:

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

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

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

我正在使用此代码将整数格式化为设备中设置的语言。在上面的示例中,我对语言环境进行了硬编码,但我使用的是设备的语言,它工作得非常好。

简而言之,问题是如何将这些整数符号转换为设备当前语言的原生符号。

4

1 回答 1

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) //"十二亿三千四百五十六万七千八百九十"

这里是数字格式和国际化的一个很好的解释。


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

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.usesGroupingSeparatorfalse.

于 2018-10-22T22:35:33.423 回答