Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

DecimalFormat não funcionando

Estou realizando a formatação, mas o campo de preço não está aceitando o ponto, apenas números. Já tentei até mesmo copiar o gabarito do github mas o resultado é o mesmo.

var price by remember { mutableStateOf("") }
        val formatter = remember {
            DecimalFormat("#.##")
        }

        TextField(
            value = price,
            onValueChange = {

                try {
                    val formated = formatter.format(BigDecimal(it))
                    Log.i("FormaterLog", "ProductFormScreen: $formated")
                    price = formated
                } catch (e: IllegalArgumentException) {
                    if (it.isBlank()) {
                        price = it
                    }
                }
            },
            Modifier.fillMaxWidth(),
            label = { Text(text = "Preço") },
            placeholder = { Text(text = "Digite o preço") },
            keyboardOptions = KeyboardOptions(
                keyboardType = KeyboardType.Decimal,
                imeAction = ImeAction.Next
            )
        )
2 respostas

Oi

Você pode forçar a formatação com ponto decimal definindo explicitamente o local no DecimalFormat. Aqui está uma modificação no seu código para garantir que ele use o ponto como separador decimal:

var price by remember { mutableStateOf("") }
val formatter = remember {
    DecimalFormat("#.##", DecimalFormatSymbols(Locale.US))
}

TextField(
    value = price,
    onValueChange = {
        try {
            val formatted = formatter.format(BigDecimal(it))
            Log.i("FormatterLog", "ProductFormScreen: $formatted")
            price = formatted
        } catch (e: IllegalArgumentException) {
            if (it.isBlank()) {
                price = it
            }
        }
    },
    Modifier.fillMaxWidth(),
    label = { Text(text = "Preço") },
    placeholder = { Text(text = "Digite o preço") },
    keyboardOptions = KeyboardOptions(
        keyboardType = KeyboardType.Decimal,
        imeAction = ImeAction.Next
    )
)

Aqui adicionei DecimalFormatSymbols(Locale.US) para garantir que o separador decimal seja sempre um ponto. Lembre de colocar o import necessário para Locale esteja incluído no seu código.

Lembrando que, caso a localização do seu aplicativo seja diferente da configuração do sistema (por exemplo, se você estiver desenvolvendo um aplicativo internacional), você pode ajustar o Locale de acordo com as necessidades do seu aplicativo.

solução!

Infelimente com essa solução o problema ainda continua.

Mas encontrei o problema com o format. Esse formatter estava esperando 2 dígitos depois do separador, e como esses dígitos não existiam no momento em que o ponto era usado ele não aceitava.

Fiz mais testes e notei que se eu digitasse uma quantia e colocasse o separador posteriormente (ex: 12485 -> 124.85) ele aceitava.

Então alterei o formater pattern para DecimalFormat("#.00") que automaticamente preenche os zeros depois do separador desde o começo.

E estou considerando colocar DecimalFormat("0.00")