Android 浮点值的复数形式

Android Plurals for float values

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

比如设置1.5星的时候,我要这样理解,不是1星而是1.5星s.

<plurals name="stars">
  <item quantity="one">%d star</item>
  <item quantity="other">%d stars</item>
</plurals>

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

该方法如下所示:

String getQuantityString(@PluralsRes int id, int quantity, Object... formatArgs)

其中 数量 定义为 Int

有什么解决办法吗?

只需这样做:

getQuantityString(R.plurals.stars, quantity > 1f ? 2 : 1, quantity):

并将字符串中的 %d 替换为 %f。

进一步研究后,看来对此没有好的解决方案

正如在其他答案中看到的那样,他们总是需要很多 "manual processing" 与创建单独的字符串资源相比,它不需要不同的工作流程。

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

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

所以答案是:似乎没有完美的解决方案(意思是Android系统解决了"automatically")。

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

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

其他情况必须 "hard coded"。因此,例如,您必须决定 0 是否表示

"0 星s"(复数字符串)或

"无星号"(单数字符串)

但使用复数似乎没有真正的好处,而不是使用通用占位符的单独字符串资源。 另一方面,这(终于对我而言)为格式化选项提供了更大的灵活性。例如,一个人可能会创建一个像“1 星半”这样的文本,它再次变成单数(即使在数字上我们会写 1.5 星)。

不要对小数使用复数形式。坚持使用基本的字符串资源并使用占位符:

<string name="fractional_stars">%1$s stars</string>

getString(R.string.fractional_stars, 0.5F.toString())

<string name="fractional_stars">% stars</string>

getString(R.string.half_a_star).replace("%", 0.5F.toString())