如何实现千位分隔符的可视化转换,也适用于小数.我发现了一个实现千分隔符的Int数字的可视化转换,但问题是当我想要使用它的小数时,我必须控制小数分隔符的计数不超过1倍.

Implementation link

推荐答案

您可以使用:

  • 100属性使用正则表达式模式将允许的字符限制为十进制数
  • 100以使用千位分隔符格式化数字

类似于:

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时,光标在值的末尾保持不动.否则,您必须计算OffsetMapping0sSeparatorCount并根据它确定偏移量.

enter image description here

Android相关问答推荐

如何正确增加LazyStream中的变量

如何go 除回调流中不可用的状态?

如何制作带有图标和文本的Fab

将DiffUtils用于Android上的Recrecerview适配器

如何在Android中编写挂起函数和stateflow的单元测试

在内部创建匿名对象的繁忙循环调用函数会产生开销吗?

我无法连接到信号机

制作圆形SupportMapFragment

为什么我的 APK 中包含来自旧版 Android 支持库的类?

Jetpack Compose 中的用户在线指示器

在 AGP 8.0 中构建失败,无法应用插件realm-android. APIandroid.registerTransform已删除

appcompat 依赖从何而来?

判断 AAR 元数据时发现 Android 问题:androidx.core:core:1.12.0-alpha01 和 androidx.core:core-ktx:1.12.0-alpha01

在 Jetpack Compose 中使用 ViewModel 实现 startActivity 的最佳实践

PayUCheckoutPro Android SDK 实现问题

Jetpack Compose - 每次点击按钮都不起作用

如何在 Compose 中使用合并的单元格创建网格视图?

没有互联网连接时,Firebase Storage putFile() 永远不会完成

在 Kotlin 客户端应用程序中发送 FCM 推送通知 - Firebase 云消息传递

如果我在网络请求中指定它们是否与判断网络功能相关