基于某些集合大小处理单数/复数单词的有效方法

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

我想知道是否有一个开源JSP自定义标记库,它允许我完成这个。 我知道我自己可以写一个……基本上,它会有两个参数: 。 根据集合大小,它将决定是否附加“s”。 但是,这个实现不会太强大,因为我还需要处理“ies”,有些词不使用任何这些。 因此,我希望有一个更强大的库可以立即使用,而不是创建一个半生不熟的工具。 在这种情况下,我并不太担心用is / are作为前缀。

顺便说一下,我使用Java。

非常感谢。

看看inflector ,一个java项目,它可以让你做Noun.pluralOf("user") ,或者Noun.pluralOf("user", userList.size()) ,它可以处理一堆变化和不寻常的情况(人 – > people,loaf-> loaves等),以及在必要时让您定义自定义映射规则。

嗯,我不太明白你为什么需要一个库。 我认为这样做的function是微不足道的:

 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 ... 

也许这个库会做一大堆其他有用的东西。 我想你可以说它提供了所有复数forms的字典,但在任何给定的程序中你不关心语言中所有单词的复数,只是你在这个程序中使用的那些单词。 我想如果在编译时不知道可能是单数或复数的单词,如果它是由用户输入的东西,那么我想要第三方字典而不是试图自己构建一个。

编辑

突然之间,我发现你所寻找的是一般制作复数的function,体现了一系列规则,如“通常只是加’s’,但如果单词以’y’结尾,则将’y’改为’ies’ ‘,如果以’s结尾’将其改为’ses’,……“等我用英语认为这对任何实际目的都是不可能的:有太多特殊情况,比如”人/人“和”孩子/孩子等等。我认为你能做的最好的事情就是拥有一个通用的“添加”规则,可能是其他一些常见案例,然后是一长串例外情况。 也许在其他语言中,人们可能会提出一个相当简单的规则。

因此,正如我所说,如果在编译时不知道这个词,而是来自某些用户输入,那么是的,非常需要第三方字典。

这在英语以外的语言中变得复杂,变形器旨在将来支持。

我熟悉捷克用户=uživatel和:

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

您可以看到为什么用硬编码的单数+复数编写的程序将无法使用。

此function内置于Ruby on Rails中。 我不确切知道在哪里,但它应该很容易在源代码中找到,然后你可以简单地编写代码。

编辑:找到你的一些代码:

  • inflector.rb (非常有用的评论!)
  • inflections.rb (广泛的单词列表)

如果我没记错的话,主要是在大多数单词上添加“s”,尽管我相信有一些常见exception的列表(可能是哈希,错误字典)。 值得注意的是从“人”到“人”的转换:)

如果您决定将其国际化为除英语之外的其他语言,那么您当然会陷入痛苦的世界。 欢迎来到高度不规则的语法世界,祝你好运!