Локализуйте числовые целые числа для разных языков - PullRequest
0 голосов
/ 22 октября 2018

Мне нужно было локализовать числовые целые числа (например, 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.

Я использую этот код для форматирования целых чисел в соответствии с языком, установленным в устройстве.В приведенных выше примерах я жестко закодировал локали, но для этого я использую язык устройства, который прекрасно работает.

Итак, вкратце, проблема заключается в том, как преобразовать эти целые символы в нечто, родное для текущего языка устройства..

1 Ответ

0 голосов
/ 23 октября 2018

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.usesGroupingSeparator значение false.

...