Подтвердить что ты не робот

Objective-C: номера формата в ординалы: 1, 2, 3,.. до 1-го, 2-го, 3-го

В Objective C есть ли способ форматировать integer для ординалов 1 = > "1st", 2 = > "2nd" и т.д., Который работает для любого языка? Поэтому, если пользователь является французским, он увидит "1er", "2ieme" и т.д.

Спасибо большое!

Edit: Это для приложения iOs

4b9b3361

Ответ 1

Вы взглянули на TTTOrdinalNumberFormatter, который находится в FormatterKit? Он отлично работает, и я уверен, что это именно то, что вы ищете.


Вот пример, взятый из набора:

TTTOrdinalNumberFormatter *ordinalNumberFormatter = [[TTTOrdinalNumberFormatter alloc] init];
[ordinalNumberFormatter setLocale:[NSLocale currentLocale]];
[ordinalNumberFormatter setGrammaticalGender:TTTOrdinalNumberFormatterMaleGender];
NSNumber *number = [NSNumber numberWithInteger:2];
NSLog(@"%@", [NSString stringWithFormat:NSLocalizedString(@"You came in %@ place!", nil), [ordinalNumberFormatter stringFromNumber:number]]);

Предполагая, что вы предоставили локализованные строки для "Вы пришли в% @place!", выход будет:

* English: "You came in 2nd place!"
* French: "Vous êtes venu à la 2eme place!"
* Spanish: "Usted llegó en 2.o lugar!"

Ответ 2

Решение немедленно доступно из NSNumberFormatter:

- (NSString *)getOrdinalStringFromInteger:(NSInteger)integer
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setLocale:[NSLocale currentLocale]];
    [formatter setNumberStyle:NSNumberFormatterOrdinalStyle];
    return [formatter stringFromNumber:[NSNumber numberWithInteger:integer]];
}

Ответ 3

Вы можете использовать ICU, который включает способ делать то, что вы описываете:

http://icu-project.org/apiref/icu4c/classRuleBasedNumberFormat.html

Вы не говорите, какой контекст вы используете Objective-C, но если вы пишете для Cocoa, ICU на самом деле присутствует. Тем не менее, достижение прямого контакта с ним может быть немного сложным.

[отредактировано, чтобы связать кого-то, кто на самом деле, похоже, понял, как построить ICU и связать его]

Как построить ICU, чтобы я мог использовать его в iPhone-приложении?

Ответ 4

Вам нужен набор правил для каждого языка, который вы хотите поддерживать. Любой язык задает слишком много: все они совершенно разные. Во-первых, создайте класс набора правил, который содержит регулярные и исключения для данного языка. Этот класс нуждается в одном методе, который принимает число и возвращает строковый суффикс (или число плюс суффикс.) Создает экземпляры набора правил (статически) для каждого интересующего вас языка.

Затем создайте категорию на NSNumber, которая вернет суффикс, вытащенный из соответствующего набора правил для любого языка, который нужен пользователю (системный язык или какой-либо выбор, который они делают или в каждом случае.)

Конечно, каждый язык имеет разные правила. Например, английский относительно сложный:  первый,  второй,  третий,  четвёртый,  пятые,  ... 20-й и затем он начинается снова на st, nd, rd, th... Единицы 1s, 2s, 3s и 4s всегда являются особыми случаями. Ноль - это "th" (нулевой, сотый, миллионный и т.д.).

Французский язык отличается. 1er, то это x ième полностью вверх. (Обычно они сокращаются до "re" и "e", что делает французский довольно легко.)

Японцы очень странно. Кардинал 1, 2, 3, 4: (ichi, ni, san, yon) становится tsuichi, futsuka, mikka и yokka. Тем не менее, это не суффиксы: цифры называются по-разному, когда они используются в качестве ординалов. К счастью, потому что это невероятно запутанно, вы можете просто прикрепить символ кандзи "кай" (который выглядит как коробка в коробке) после номера, и все знают, что вы имеете в виду.

Ответ 5

Swift:

func getOrdinalDegreeValue() -> String? {
    let formatter = NumberFormatter()
    formatter.locale = Locale.current
    formatter.numberStyle = .ordinal
    return formatter.string(from: NSNumber(value: 1)) // Number
}

1st