Olá! primeiramente desculpa caso não seja permitidos tópicos de duvidas de algo fora das aulas, sou novo na plataforma. Estou fazendo um app para portifólio onde será um gestor de finanças. Em um formulário eu tenho um OutilinedTextField que recebe o valor que posteriormente vai ser salvo na base. Até aí tudo bem, porém tenho a seguinte função em uma classe NumberUtil que utilizo para formatar as entradas de numero
fun formatCurrency(s: String): String {
var v = digitisOnly(s)
if (v.isEmpty()) {
v = "0"
}
if (v.length == 1) {
v = "0,0$v"
} else if (v.length == 2) {
v = "0,$v"
} else {
val part1 = v.substring(v.length - 2)
val part2 = v.substring(0, v.length - 2)
v = "$part2,$part1"
}
return v
}
Em resumo, a função formatCurrency converte a entrada em um formato de valor monetário com uma vírgula para separar os centavos, adicionando zeros à frente dos dígitos conforme necessário.
acontece que ao passar pelo onvaluechange do OutlinedTextField o comportamento não esta funcionando como eu pensei.
supondo que eu digite o valor 150 ele formata corretamente 1,50 entretanto ao precionar o backspace duas vezes o correto seria ficar 0,01 porem ficar 0,05 por o cursor vai para o segundo 0.
alguem faz alguma ideia do motivo disso?
para ter mais contexto esse aqui é o Outlinedtextfied que receberá o valor
OutlinedTextField(
value = if (selectedOption.value == MONETARIO) {
mDecimalFormatter.format(currentValueDouble)
} else {
val formattedValue =
mDecimalFormatter.format(currentValuePercent).replace(",", ".")
if (isDesconto) {
formattedValue.take(5)
} else {
formattedValue
}
},
onValueChange = { newValue: String ->
val formattedValue = newValue.replace(",", ".")
if (selectedOption.value == MONETARIO) {
currentValueDouble = if (isDesconto) {
val newValueDouble = strToDouble(
formatCurrency(formattedValue),
0.0
)
newValueDouble.coerceIn(
0.0,
totalPedido * 0.99
)
} else {
val newValueDouble = Numbers.strToDouble(
Numbers.formatCurrency(formattedValue),
0.0
)
newValueDouble
}
} else {
currentValuePercent = if (isDesconto) {
val newValueDouble = Numbers.strToDouble(
Numbers.formatCurrency(formattedValue),
0.0
)
newValueDouble.coerceIn(0.0, 99.0)
} else {
val newValueDouble = Numbers.strToDouble(
Numbers.formatCurrency(formattedValue),
0.0
)
newValueDouble
}
}
},
colors = TextFieldDefaults.outlinedTextFieldColors(
unfocusedBorderColor = AzulEscuro,
cursorColor = AzulEscuro,
textColor = AzulEscuro
),
modifier = Modifier.fillMaxWidth(),
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number)
)