Objective-C: номера формата в ординалы: 1, 2, 3,.. до 1-го, 2-го, 3-го
В Objective C есть ли способ форматировать integer
для ординалов
1 = > "1st", 2 = > "2nd" и т.д., Который работает для любого языка?
Поэтому, если пользователь является французским, он увидит "1er", "2ieme" и т.д.
Спасибо большое!
Edit:
Это для приложения iOs
Ответы
Ответ 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