jetpack组合中价格的视觉转换



我正在尝试以"##,#####&";,我面临的主要问题是,当我使用DecimalFormat解析字符串时,如果第一个字符是0,然后用户正在输入不同的数字,则应用程序将崩溃,因为从重写函数返回的偏移量超出了数组的偏移量,因为0被十进制格式删除。下面是实现的代码。只有在第一个字符输入为0的情况下,我才会尝试解决此问题。我认为解决这个问题的一个方法是在onValueChange中将字符串转换为数字,然后将其转换为字符串,但这似乎不是一个好的解决方案,需要寻找其他解决方案。

class PriceTransformation(private val prefix: String = "₹ ") : VisualTransformation {
override fun filter(text: AnnotatedString): TransformedText {
var specialCharsCount = 0
var leadingZeroCount = 0
val zerosIndex = mutableListOf<Int>()
val originalToTransformed = mutableListOf<Int>()
val transformedToOriginal = mutableListOf<Int>()
val output = prefix + text.text.toBigDecimal().formattedPrice()
output.forEachIndexed { index, char ->
if (output[index] == "₹".single() || output[index] == " ".single() || output[index] == ",".single()) {
specialCharsCount++
} else {
originalToTransformed.add(index)
}
transformedToOriginal.add(index - specialCharsCount)
}
originalToTransformed.add(originalToTransformed.maxOrNull()?.plus(1) ?: 0)
transformedToOriginal.add(transformedToOriginal.maxOrNull()?.plus(1) ?: 0)
val offsetMapping = object : OffsetMapping {
override fun originalToTransformed(offset: Int): Int {
return originalToTransformed[offset]
}
override fun transformedToOriginal(offset: Int): Int {
return transformedToOriginal[offset]
}
}
return TransformedText(
text = AnnotatedString(output),
offsetMapping = offsetMapping
)
}

}

我也有同样的问题。但我在onValueChange解决了这个问题。

这是我的代码:

var value by remember { mutableStateOf("") }
TextField(
...
value = value,
onValueChange = { value = if (it.isEmpty()) "" else BigInteger(it.filter { c -> c.isDigit() }).toString() },
visualTransformation = ComposeVisualTransformation.Builder.Number().build()
)

最新更新