Objective-C: отформатировать числа в порядковые номера: 1, 2, 3, .. до 1, 2, 3

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

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

Редактировать: это для приложения iOs

4 ответа

Решение

Вы смотрели на 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!"

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

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

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

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

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

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

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

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

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

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

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

Японец становится очень странным. Кардинал 1, 2, 3, 4: (ичи, ни, сан, йон) становится тсуичи, футсука, микка и йокка. Однако это не суффиксы: числа называются по-разному, когда они используются в качестве порядковых. К счастью, потому что это невероятно сбивает с толку, вы можете просто вставить символ кандзи "кай" (который выглядит как коробка в коробке) после числа, и все знают, что вы имеете в виду.

Swift:

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

1-й

Другие вопросы по тегам