Formatar em modelos de string kotlin


199

O Kotlin possui um excelente recurso chamado modelos de string. Eu realmente amo isso.

 val i = 10 
 val s = "i = $i" // evaluates to "i = 10"

Mas é possível ter alguma formatação nos modelos? Por exemplo, eu gostaria de formatar Double em modelos de string no kotlin, pelo menos para definir um número de dígitos após um separador decimal:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?

Existe alguma solução multiplataforma para isso?
KenIchi 21/01

Respostas:


248

Infelizmente, ainda não há suporte interno para formatação em modelos de string, como solução alternativa, você pode usar algo como:

"pi = ${pi.format(2)}"

a .format(n)função que você precisa para se definir como

fun Double.format(digits: Int) = "%.${digits}f".format(this)

Claramente, há uma parte da funcionalidade que está faltando no Kotlin no momento, vamos corrigi-la.


7
Isso está disponível agora?
Ragunath Jawahar 13/03

4
@RagunathJawahar, a resposta ainda está atualizada, ainda não a aprimoramos
Andrey Breslav /

3
@AndreyBreslav Que tal agora? Isso está disponível?
Adil cihan sete

37
Estou enganado ou isso ainda não está disponível quase quatro anos depois?
Warkst 19/01/19

6
Adicione-o como presente de Ano Novo para 2020!
marca mark

132

Como solução alternativa, existe uma função stdlib do Kotlin que pode ser usada de uma maneira agradável e totalmente compatível com o formato String do Java (é apenas um invólucro do Java String.format())

Veja a documentação do Kotlin

Seu código seria:

val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)

2
Suponho que ele quis dizer esta documentação: docs.oracle.com/javase/8/docs/api/java/lang/…
stuckj

@Rob Veja também a discussão sobre a documentação
Matt Mc

Funciona no Kotlin 1.3.21
FP livremente

27

A classe String do Kotlin agora possui uma função de formato , que usa internamente o String.formatmétodo Java :

/**
 * 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)

Uso

val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14

1
O String.Companion.format não foi encontrado agora no Kotlin v1.2.21. Qual é a alternativa?
Sai

19

É simples, use:

val str:String = "%.2f".format(3.14159)

3

Como String.formaté apenas uma função de extensão (veja aqui ) que chama internamente, java.lang.String.formatvocê pode escrever sua própria função de extensão usando o DecimalFormat do Java, se precisar de mais flexibilidade:

fun Double.format(fracDigits: Int): String {
    val df = DecimalFormat()
    df.setMaximumFractionDigits(fracDigits)
    return df.format(this)
}

println(3.14159.format(2)) // 3.14

0

Alguns exemplos:

infix fun Double.f(fmt: String) = "%$fmt".format(this)
infix fun Double.f(fmt: Float) = "%${if (fmt < 1) fmt + 1 else fmt}f".format(this)

val pi = 3.14159265358979323

println("""pi = ${pi f ".2f"}""")
println("pi = ${pi f .2f}")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.