Формат в шаблонах строк kotlin
У Kotlin есть отличная функция, которая называется строковые шаблоны. Мне действительно нравится это.
val i = 10
val s = "i = $i" // evaluates to "i = 10"
Но возможно ли иметь какое-либо форматирование в шаблонах? Например, я хотел бы отформатировать Double в строковых шаблонах в kotlin, по крайней мере, чтобы установить количество цифр после десятичного разделителя:
val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?
Ответы
Ответ 1
К сожалению, пока нет встроенной поддержки форматирования в строковых шаблонах. В качестве обходного пути вы можете использовать что-то вроде:
"pi = ${pi.format(2)}"
функцию .format(n)
, которую вам нужно определить как
fun Double.format(digits: Int) = "%.${digits}f".format(this)
Здесь явно есть часть функциональности, которой в Kotlin на данный момент не хватает, мы это исправим.
Ответ 2
В качестве обходного пути, есть функция Kotlin stdlib, которая может быть использована хорошим способом и полностью совместима с форматом Java String (это всего лишь оболочка для Java String.format()
)
См. Kotlin документацию
Ваш код будет:
val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)
Ответ 3
Класс Kotlin String теперь имеет функцию форматирования, которая внутренне использует метод Java String.format
:
/**
* Uses this string as a format string and returns a string obtained by substituting the specified arguments,
* using the default locale.
*/
@kotlin.internal.InlineOnly
public inline fun String.Companion.format(format: String, vararg args: Any?): String = java.lang.String.format(format, *args)
использование
val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14
Ответ 4
Это просто, используйте:
val str:String = "%.2f".format(3.14159)
Ответ 5
Так как String.format
является только функцией расширения (см. здесь), который внутренне вызывает java.lang.String.format
, вы можете написать свою собственную функцию расширения, используя Java DecimalFormat, если вам нужна дополнительная гибкость:
fun Double.format(fracDigits: Int): String {
val df = DecimalFormat()
df.setMaximumFractionDigits(fracDigits)
return df.format(this)
}
println(3.14159.format(2)) // 3.14
Ответ 6
Попробуй взять. Возвращает список, содержащий первые n элементов.
val pi = 3.14159265358979323
val s = pi.take(4)
Но это как раз о коллекциях, как сказал rekire, который вежливо исправил меня в комментарии ниже.
Вы можете конвертировать в строку, использовать взять и конвертировать обратно в двойной.
val a = 3.14159265358979323
val b = a.toString().take(4).toDouble()
Не самая лучшая идея, но она работает.