【发布时间】:2012-01-14 07:11:49
【问题描述】:
在 Objective C 中,有没有办法将integer 格式化为序数
1 => "1st"、2 => "2nd" 等...适用于任何语言?
因此,如果用户是法国人,他会看到“1er”、“2ieme”等。
非常感谢!
编辑: 这是一个 iOS 应用程序
【问题讨论】:
标签: objective-c ios numbers format number-formatting
在 Objective C 中,有没有办法将integer 格式化为序数
1 => "1st"、2 => "2nd" 等...适用于任何语言?
因此,如果用户是法国人,他会看到“1er”、“2ieme”等。
非常感谢!
编辑: 这是一个 iOS 应用程序
【问题讨论】:
标签: objective-c ios numbers format number-formatting
您看过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]]);
假设您为“You come in %@ place!”提供了本地化字符串,输出将是:
* English: "You came in 2nd place!"
* French: "Vous êtes venu à la 2eme place!"
* Spanish: "Usted llegó en 2.o lugar!"
【讨论】:
解决方案可立即从 NSNumberFormatter 获得:
- (NSString *)getOrdinalStringFromInteger:(NSInteger)integer
{
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setNumberStyle:NSNumberFormatterOrdinalStyle];
return [formatter stringFromNumber:[NSNumber numberWithInteger:integer]];
}
【讨论】:
您可以使用 ICU,其中包括按照您描述的方式进行操作:
http://icu-project.org/apiref/icu4c/classRuleBasedNumberFormat.html
你没有说你在什么上下文中使用 Objective-C,但如果你是为 Cocoa 写的,ICU 确实存在。但是,向下直接与它交谈可能有点棘手。
[编辑链接到实际上似乎已经弄清楚如何构建 ICU 并链接它的人]
【讨论】:
您需要为要支持的每种语言设置一个规则集。 任何语言都要求太多:它们都大相径庭。首先,创建一个规则集类,其中包含给定语言的常规和异常情况。该类需要一个方法,该方法接受一个数字并返回一个字符串后缀(或数字加上后缀)。为您关心的每种语言创建规则集实例(静态)。
然后在 NSNumber 上创建一个类别,该类别返回从用户需要的任何语言(系统区域设置,或他们做出的某些选择,或逐个案例)的适当规则集中提取的后缀。
当然,每种语言都有不同的规则。比如英文就比较复杂: 第一, 第二, 第三, 第四, 第五, ... 20 日 然后从 st, nd, rd, th 重新开始…… 单元 1s、2s、3s 和 4s 总是特殊情况。零是“第”(第零、百、百万等)
法语不一样。 1er,然后是 x ième 一直向上。 (这些通常缩写为“re”和“e”,让法语变得很容易。)
日语变得很奇怪。红衣主教 1、2、3、4:(ichi、ni、san、yon)变为 tsuichi、futsuka、mikka 和 yokka。不过,这些不是后缀:当数字用作序数时,它们的命名方式不同。幸运的是,因为这非常令人困惑,你可以在数字后面加上一个汉字“kai”字符(看起来像一个盒子里的盒子),每个人都知道你的意思。
【讨论】:
斯威夫特:
func getOrdinalDegreeValue() -> String? {
let formatter = NumberFormatter()
formatter.locale = Locale.current
formatter.numberStyle = .ordinal
return formatter.string(from: NSNumber(value: 1)) // Number
}
第一个
【讨论】: