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

10-08 03:43