【问题标题】:How to convert Cardinal numbers into Ordinal ones如何将基数转换为序数
【发布时间】:2010-09-13 06:02:12
【问题描述】:

有没有一种简单的方法可以将数字 1、2、3、...语言并让它返回我所针对的语言的正确形式?标准 C++(stl 或 boost OK)、MFC 或 ATL、win32 api 或小型、单一用途且免费的库,我可以从某个地方下载。谢谢。

【问题讨论】:

    标签: c++ mfc ordinals


    【解决方案1】:

    我怀疑这是否可能,因为在许多语言中,这种形式将取决于上下文,例如它所描述的名词的性别或大小写,并且不同的语言将需要不同类型的上下文信息来确定正确的形式.

    编辑:例如在波兰语中是“5-ta klasa”(第 5 级)vs.“5-ty miesiąc”(第 5 个月)vs.“w 5-tym miesiącu”(第 5 个月)。

    【讨论】:

    • 您有任何特定的语言或示例吗? AFAIK,但我的实践经验仅限于西欧语言,序数(1st, 2nd)总是相同的,只有完全拼写出来的形式是共轭的(例如西班牙语中的 el secundo mano/la secunda dia)。
    • 有趣,谢谢。看起来我将使用 ICU 库来获取序数,但我不知道他们如何处理这个问题。我会测试一下。
    • @Roel:它是“el segundo día/la segunda mano”,即使没有完全拼写出来,它们也是不同的:el 2º día/la 2ª mano
    【解决方案2】:

    我花了很多时间研究这个,因为它是一个太大的项目,我自己无法解决。看起来 ICU 库是唯一一个以某种全面的方式提供此功能的库 (http://www.icu-project.org/apiref/icu4c/classRuleBasedNumberFormat.html)。不过,我不太热衷于合并这样一个庞大的库。我会继续寻找,我仍然愿意接受建议。

    【讨论】:

      【解决方案3】:

      您是否在 Unicode 站点上查找过 CLDR 存储库?我不知道他们是否有这种东西,但由于它可能是那里最全面的语言环境数据存储库,它可能值得一看。 http://www.unicode.org/cldr/

      【讨论】:

      • 是的,CLDR 有序数信息,ICU 将其用作数据源。不过,我必须围绕它编写自己的代码,或者将与序数相关的代码从 ICU 拆分到一个单独的子库中。两者都不是很有吸引力。
      【解决方案4】:

      由于您使用 C++,我假设您可以使用 GNU gettext(也有一个 Windows 端口)进行所有翻译,或者至少了解他们是如何解决它的。以下是复数形式的相关手册页,解释了问题(您已经找到,但更详细)及其解决方案:

      http://www.gnu.org/software/automake/manual/gettext/Plural-forms.html

      【讨论】:

      • 我可以在 gettext 中找到的唯一功能是复数,而不是序数。我可以使用与他们的方法类似的方法来构建自己的解决方案,但我不希望这样做;我需要接触许多母语人士。我没有那么积极:) 此外,gettext 是 GPL,因此不适合我使用。
      【解决方案5】:

      Here 是 CodeProject 上完成这项工作的一段代码。我自己没试过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多