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>