1
resposta

[Dúvida] Nao consigo deixar o price com o padrao passado

Segui a aula para deixar o formato do price , com o padrao "#.##", mas ao digitar valores ele nao tem limitação de caracteres e nem aceita "." ou "," Meu codigo ficou da seguinte maneira


        var price by remember { mutableStateOf("") }

        val formatter = remember { DecimalFormat("#.##") }
        TextField(
            value = price,
            onValueChange = {
                try {
                    price = formatter.format(BigDecimal(it))
                } catch (e: IllegalArgumentException) {
                    if (it.isBlank()) {
                        price = it
                    }
                }
            },
            Modifier.fillMaxWidth(),
            label = {
                Text("Price")
            }, keyboardOptions = KeyboardOptions(
                keyboardType = KeyboardType.Decimal,
                imeAction = ImeAction.Next
            )
        )
1 resposta

Oi, Robson! Como vai?

O problema aqui é que o DecimalFormat não funciona corretamente ao formatar valores digitados diretamente no TextField. Além disso, quando o usuário digita, a conversão direta para BigDecimal pode gerar erros se a entrada não for numérica.

Para resolver isso, podemos usar uma abordagem que permite apenas números e o caractere de separação decimal. Veja este exemplo:



var price by remember { mutableStateOf("") }

val formatter = DecimalFormat("#.##")

TextField(
    value = price,
    onValueChange = { input ->
        val filteredInput = input.replace(",", ".") // Substitui vírgula por ponto
            .filter { it.isDigit() || it == '.' } // Permite apenas números e ponto

        if (filteredInput.count { it == '.' } <= 1) { // Garante apenas um ponto decimal
            price = filteredInput
        }
    },
    modifier = Modifier.fillMaxWidth(),
    label = { Text("Price") },
    keyboardOptions = KeyboardOptions(
        keyboardType = KeyboardType.Decimal,
        imeAction = ImeAction.Next
    )
)

  • Substituímos a vírgula por um ponto para manter um único formato decimal.
  • Filtramos a entrada, permitindo apenas números e um único ponto decimal.
  • Evitamos múltiplos pontos decimais verificando sua quantidade antes de atualizar o price.

Com essa solução, o campo aceitará apenas números e um único ponto decimal, garantindo um comportamento mais controlado.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓