我想在我的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 。
有什么解决办法吗?
最佳答案
首先我必须说:一个非常有趣的问题。
其次,这是解决方案:将%s代替%d用作占位符。
<plurals name="stars">
<item quantity="one">%s star</item>
<item quantity="other">%s stars</item>
</plurals>
然后,您必须在数量上使用
Math.ceil()
。因此,例如1.1f
将变为2
,因此您的文本将从的变成星形。我已经用Kotlin和Java编写了该解决方案。
对于Kotlin,我编写了一个扩展函数,如下所示:
fun Resources.getQuantityString(@PluralsRes pluralResId: Int, pluralValue: Float) =
this.getQuantityString(R.plurals.stars, Math.ceil(pluralValue.toDouble()).toInt(), pluralValue)
可以这样称呼:
tvText.text = resources.getQuantityString(R.plurals.stars, 1.1f)
对于Java,我的解决方案如下所示:
import android.content.res.Resources;
import android.support.annotation.PluralsRes;
public class PluralResource {
public static String get(Resources resources, @PluralsRes int pluralResId, float pluralValue) {
return resources.getQuantityString(pluralResId, (int) Math.ceil(pluralValue), pluralValue);
}
}
像这样被称为:
tvText.text = PluralResource.get(resources, R.plurals.stars, 1.1f)