用于浮点值的Android Plurals

Tob*_*ich 5 string.format android plural

我想在我的Android项目中使用复数形式.但是,我提供的值可以是浮点值.

因此,例如,设置1.5星级的时候,我想这种理解,这不是1星级,但1.5星小号.

<plurals name="stars">
  <item quantity="one">%d star</item>
  <item quantity="other">%d stars</item>
</plurals>
Run Code Online (Sandbox Code Playgroud)

但是,Android系统似乎只使用整数值(%d).

该方法如下所示:

String getQuantityString(@PluralsRes int id, int quantity, Object... formatArgs)
Run Code Online (Sandbox Code Playgroud)

其中数量定义为Int.

这有什么解决方案吗?

Tob*_*ich 2

经过进一步研究,似乎没有很好的解决方案。

正如其他答案中所见,它们总是需要大量的“手动处理”,与创建单独的字符串资源没有不同的工作流程。

一般建议似乎是手动舍入/处理浮点值(例如检查浮点值是否匹配 1.0),然后使用适当的 Int 值进行复数调用。

但除了没有真正使用复数之外,这还带来了其他语言的问题(例如,我不知道 1.5 颗星在另一种语言中是否也像英语一样是复数),因此这些舍入选项可能并不普遍适用。

所以答案是:似乎没有完美的解决方案(意思是由Android系统“自动”解决)。

因此,我实际上所做的就是简单地选择异常并在那里使用不同的字符串。所以目前的(伪代码)方式看起来像

// optionally wrap different languages around
// if language == English

   when (amountStars) {
    is 1.0 -> getString(R.string.stars_singular, 1) 
    ... ->
    else -> getString(R.string.stars_plural, amountStars)
   }
// if language == Chinese ...
Run Code Online (Sandbox Code Playgroud)

其中其他情况必须“硬编码”。例如,你必须决定 0 是否意味着

“ 0 star s ”(复数字符串)或

“无星”(单数字符串)

但与具有公共占位符的单独字符串资源相比,使用复数似乎没有真正的好处。另一方面,这(最后对我来说)为格式选项提供了更大的灵活性。例如,人们可以创建一个类似“1 星半”的文本,它再次变为单数(即使在数字上我们会写 1.5 颗星)。