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())
我想在我的 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())