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

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

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

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

Ответы [ 4 ]

14 голосов
/ 06 декабря 2011

Вы смотрели на 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!"
7 голосов
/ 14 октября 2016

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

- (NSString *)getOrdinalStringFromInteger:(NSInteger)integer
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setLocale:[NSLocale currentLocale]];
    [formatter setNumberStyle:NSNumberFormatterOrdinalStyle];
    return [formatter stringFromNumber:[NSNumber numberWithInteger:integer]];
}
3 голосов
/ 06 декабря 2011

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

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

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

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

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

2 голосов
/ 06 декабря 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...