代码之家  ›  专栏  ›  技术社区  ›  limc

根据集合大小处理单数/复数单词的有效方法[关闭]

  •  16
  • limc  · 技术社区  · 14 年前

    在我的工作项目中,有许多实例需要在一个句子中显示某个集合的大小。例如,如果集合的大小为5,则会显示“5个用户”。如果大小为1或0,则会显示“1用户”或“0用户”。现在,我用if-else语句来决定是否打印“s”,这很乏味。

    我想知道是否有一个开源的JSP定制标记库允许我完成这个任务。我知道我可以自己写一个。。。基本上,它有两个参数: <lib:display word="user" collection="userList" />

    顺便说一下,我用的是Java。

    4 回复  |  直到 8 年前
        1
  •  28
  •   Jacob Mattison    14 年前

    看一看 inflector ,一个java项目 Noun.pluralOf("user") ,或 Noun.pluralOf("user", userList.size())

        2
  •  10
  •   Jay    14 年前

    嗯,我不太明白你为什么需要图书馆。我认为这样做的作用是微不足道的:

    public String singlePlural(int count, String singular, String plural)
    {
      return count==1 ? singular : plural;
    }
    

    singlePlural(count, "user", "users");
    singlePlural(count, "baby", "babies");
    singlePlural(count, "person", "people");
    singlePlural(count, "cherub", "cherubim");
    ... etc ...
    

    也许这个图书馆做了很多其他的事情使它变得有用。我想你可以说,它提供了一个字典,所有的复数形式是什么,但在任何给定的程序中,你不关心语言中所有单词的复数形式,只是你在这个程序中使用的那些。我想,如果单数或复数的单词在编译时不为人所知,如果是用户输入的东西,那么我想要一个第三方词典,而不是自己建立一个。

    编辑

    因此,如我所说,如果这个词在编译时不为人所知,但来自于某些用户输入,那么是的,第三方词典是非常可取的。

        3
  •  4
  •   Frankie    4 年前

    这在英语以外的语言中变得很复杂,屈折符的目标是在将来支持它。

    我熟悉捷克语,其中user=uivatel和:

    1 uživatel
    2 uživatelé
    3 uživatelé
    4 uživatelé
    5 uživatelů

    ...

    您可以理解为什么用硬编码的单数+复数编写的程序会变得不可用。



    Java11允许您使用以下内容:

    ChoiceFormat fmt = new ChoiceFormat("1#uživatel | 1.0< uživatelé | 4< uživatelů");
    System.out.println(fmt.format(1));
    System.out.println(fmt.format(4));
    System.out.println(fmt.format(5));
    

    ChoiceFormat documentation

        4
  •  0
  •   Carl Smotricz    14 年前

    这个功能内置于rubyonrails中。我不知道具体在哪里,但应该很容易找到源代码,然后你可以简单地抄袭代码。

    编辑:找到一些代码:

    如果我没记错的话,这主要是在大多数单词后面加一个“s”的问题,尽管我相信有一个列表(可能是hash,err字典)列出了一些常见的例外。值得注意的是从“人”到“人”的转换: