如何实现千位分隔符的可视化转换,也适用于小数.我发现了一个实现千分隔符的Int数字的可视化转换,但问题是当我想要使用它的小数时,我必须控制小数分隔符的计数不超过1倍.
如何实现千位分隔符的可视化转换,也适用于小数.我发现了一个实现千分隔符的Int数字的可视化转换,但问题是当我想要使用它的小数时,我必须控制小数分隔符的计数不超过1倍.
您可以使用:
类似于:
val pattern = remember { Regex("^\\d*\\.?\\d*\$") }
TextField(
value = text,
onValueChange = {
if (it.isEmpty() || it.matches(pattern)) {
text = it
}
},
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal),
visualTransformation = ThousandSeparatorTransformation()
)
class ThousandSeparatorTransformation : VisualTransformation {
override fun filter(text: AnnotatedString): TransformedText {
val symbols = DecimalFormat().decimalFormatSymbols
val decimalSeparator = symbols.decimalSeparator
var outputText = ""
var integerPart = 0L
var decimalPart = ""
if (text.text.isNotEmpty()) {
val number = text.text.toDouble()
integerPart = number.toLong()
outputText += NumberFormat.getIntegerInstance().format(integerPart)
if (text.text.contains(decimalSeparator)) {
decimalPart = text.text.substring(text.text.indexOf(decimalSeparator))
if (decimalPart.isNotEmpty()) {
outputText += decimalPart
}
}
}
val numberOffsetTranslator = object : OffsetMapping {
override fun originalToTransformed(offset: Int): Int {
return outputText.length
}
override fun transformedToOriginal(offset: Int): Int {
return text.length
}
}
return TransformedText(
text = AnnotatedString(outputText),
offsetMapping = numberOffsetTranslator
)
}
}
值为OffsetMapping
时,光标在值的末尾保持不动.否则,您必须计算OffsetMapping
0sSeparatorCount并根据它确定偏移量.