在目标C中,有没有办法将integer
格式化为序数
1 => “1st”,2 => “第二”等......适用于任何语言?
因此,如果用户是法国人,他将看到“1er”,“2ieme”等。
非常感谢!
修改: 这适用于iOs app
答案 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并链接它的人]
答案 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
}
第一