Android множественное число для значений с плавающей точкой - PullRequest
0 голосов
/ 26 февраля 2019

Я хотел бы использовать множественное число для моего проекта Android.Однако указанные мной значения могут быть значениями с плавающей точкой.

Так, например, при установке 1,5 звезды, я хочу это понять, это не 1 звезда, а 1,5 звезды с .

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

Есть ли какое-то решение для этого?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Просто сделайте это:

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

И замените% d в ваших строках на% f.

0 голосов
/ 05 марта 2019

После проведения дальнейших исследований выясняется, что не существует хорошего решения для этого .

. Как видно из других ответов, они всегда требуют много "ручной обработки" для него.не требующий никакого другого рабочего процесса, чем создание отдельных строковых ресурсов.

Похоже, что общим предложением является округление / обработка значений с плавающей запятой вручную (например, проверка соответствия значения с плавающей запятой 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 ...

, где дополнительные случаи должны быть «жестко закодированы».Например, вам нужно решить, означает ли 0

" 0 звезда s " (множественное число) или

" без звезды "(единственная строка)

Но, похоже, нет реального преимущества использования множественного числа по сравнению с отдельными строковыми ресурсами с общими заполнителями. С другой стороны, это (наконец-то для меня) дает большегибкость для вариантов форматирования.Например, можно создать текст типа «1 звезда с половиной», где он снова станет единичным (даже если численно мы напишем 1,5 звезды).

0 голосов
/ 26 февраля 2019

Сначала я должен сказать: очень интересный вопрос.

Во-вторых, это решение: используйте% s вместо% d для вашей метки-заполнителя.

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

Затем вы должны использовать Math.ceil() для вашего количества.Так, например, 1.1f станет 2, и, следовательно, ваш текст из звезды превратится в s .

Я написал это решение на 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)

...