【问题标题】:Objective-C: format numbers to ordinals: 1, 2, 3, .. to 1st, 2nd, 3rdObjective-C:将数字格式化为序数:1, 2, 3, .. to 1st, 2nd, 3rd
【发布时间】:2012-01-14 07:11:49
【问题描述】:

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

非常感谢!

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

【问题讨论】:

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


    【解决方案1】:

    您看过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!"
    

    【讨论】:

    • 别忘了你还需要本地化语法性别,因为同一个名词在不同语言中可以有不同的性别。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案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?

      【讨论】:

      • 这适用于 ios 吗?有没有我可以看的代码示例?
      • icu 存在于 ios 上(ios 将其用于正则表达式、日期/区域设置格式等),但暴露的标头非常有限。我想你可以尝试将它作为图书馆批发,但它有点大而且构建起来很棘手:见stackoverflow.com/questions/8126233/…
      • 我刚刚从系统库中发布了一个使用 ICU4C 的 pod。使用前请检查示例项目的工作原理:github.com/dimat/DMNumberSpellOutFormatter
      【解决方案4】:

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

      然后在 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”字符(看起来像一个盒子里的盒子),每个人都知道你的意思。

      【讨论】:

      • 我喜欢这个理论概述,但我错过了解决方案。它只指出它可能很难做到。
      • 这是一个公平点 Frizi。这虽然很难。我回答的重点是类别,即解决此类问题的“Objective C”方式。
      【解决方案5】:

      斯威夫特

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

      第一个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-19
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多