Objective-C:格式数到序数:1,2,3,..到第1,第2,第3

时间:2011-12-06 17:22:36

标签: objective-c ios numbers format number-formatting

在目标C中,有没有办法将integer格式化为序数 1 => “1st”,2 => “第二”等......适用于任何语言? 因此,如果用户是法国人,他将看到“1er”,“2ieme”等。

非常感谢!

修改: 这适用于iOs app

5 个答案:

答案 0 :(得分:14)

您是否看过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!”提供了本地化字符串,则输出为:

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

答案 1 :(得分:7)

该解决方案可立即从NSNumberFormatter获得:

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

答案 2 :(得分:3)

您可以使用ICU,其中包括您所描述的方式:

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

您没有说明您使用Objective-C的上下文,但如果您正在为Cocoa编写,ICU实际上是存在的。然而,直接与它直接交谈可能有点棘手。

[编辑链接到实际上似乎已经弄清楚如何构建ICU并链接它的人]

How to build ICU so I can use it in an iPhone app?

答案 3 :(得分:2)

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

然后在NSNumber上创建一个类别,该类别返回从适当的规则集中提取的后缀,用于所需的任何语言(系统区域设置,或者他们做出的某种选择,或逐个案例。)

当然,每种语言都有不同的规则。例如,英语相对复杂:  1,  2,  3,  4,  5,  ...... 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。这些不是后缀:当它们被用作序数时,这些数字的命名方式不同。幸运的是,因为那令人难以置信的混乱,你可以在数字后面贴一个汉字'kai'字符(看起来像一个盒子里的盒子),每个人都知道你的意思。

答案 4 :(得分:0)

快速

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

第一