String placeholder всегда возвращает запятую вместо точки

Есть вот такая строка:

<string name="measure">%1$.1f</string>

Пытаюсь получить значение формата 1.11 из Float у которого может быть более чем 2 знака после запятой.

Получаю строку вот так:

val likesCount = (likeCount.toFloat() / ViewConst.HUNDRED_LIKES)
resources.getString(R.string.measure, likesCount)

На выходе всегда 1,11. Почему?


Ответы (1 шт):

Автор решения: Vadik

Способ 1

Формат дробных чисел зависит от выставленной локали, установите дефолтную локаль в onCreate в вашей активити:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    resources.configuration.setLocales(LocaleList(Locale.US))
} else {
    @Suppress("DEPRECATION")
    resources.configuration.locale = Locale.US
}

Способ 2

Если не нужно применять локаль глобально, то отформатируйте число с помощью String.format(), передав первым аргументом локаль:

val measure = String.format(Locale.US, "%.1f", 1.11)
resources.getString(R.string.measure, measure)

В xml при этом должно быть %s вместо %f:

<string name="measure">%s</string>

Способ 3

Можно явно указать, какой символ вы хотите использовать в качестве разделителя (decimalSeparator), если воспользоваться классом DecimalFormat:

val symbols = DecimalFormatSymbols().apply { decimalSeparator = '.' }
val measure = DecimalFormat("#.0", symbols).format(1.11)
resources.getString(R.string.measure, measure)

В xml указываем %s:

<string name="measure">%s</string>
→ Ссылка