Objective-C:将数字格式化为序数:1,2,3,…到1st,2nd,3rd

在目标C中,是否有任何方法来格式化一个integer序号1 =>“1st”,2 =>“2nd”等…适用于任何语言 ? 所以如果用户是法国人,他会看到“1er”,“2ieme”等。

非常感谢!

编辑 :这是一个iOs应用程序

TTTOrdinalNumberFormatter FormatterKit中的TTTOrdinalNumberFormatter吗? 它工作的很好,我很确定这正是你在找什么。


以下是从套件中取得的一个例子:

 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!”的本地化string,输出将是:

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

该解决scheme立即可以从NSNumberFormatter:

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

你可以使用加护病房,其中包括一个你所描述的方式:

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

你不会说你在使用Objective-C的上下文,但是如果你正在为Cocoa写代码,ICU实际上是存在的。 然而,直接与它谈话可能有点棘手。

[编辑链接到一个人似乎已经想出了如何build立ICU和链接]

如何build立ICU,以便在iPhone应用程序中使用它?

您需要为您要支持的每种语言设置规则。 任何一种语言都要求太多:它们完全不同。 首先,创build一个规则集合类,它包含给定语言的常规和exception情况。 该类需要一个接受一个数字并返回string后缀(或数字加后缀)的单一方法。为您关心的每种语言创build规则集实例(静态地)。

然后在NSNumber上创build一个类别,该类别返回从适当的规则集合中抽取的后缀,用于用户需要的任何语言(系统区域设置,或者他们作出的select或逐个情况)。

当然,每种语言都有不同的规则。 例如,英语比较复杂:第一,第二,第三,第四,第五,…第二十,然后在st,nd,rd,th …再次开始…单元1s,2s,3s和4s总是特例。 零是'th'(零,百,百万等)

法国是不同的。 1er,那么它一直是xième。 (这些通常缩写为“re”和“e”,使法语变得容易)。

日本人很奇怪 红衣主教1,2,3,4:(ichi,ni,san,yon)变成tsuichi,futsuka,mikka和yokka。 这些不是后缀:数字在用作序号时命名不同。 幸运的是,因为这是令人难以置信的混乱,你可以在数字后面粘上一个汉字“开”的字样(大家都知道你的意思)。