android - 如何在撰写的TextField中用逗号格式化数字

如何在 Compose 的 TextField 中用逗号格式化数字。

示例:1234567899 -> 123,456,789,9

最佳答案

最好的方法是使用 visualTransformation

例子

@Composable
fun CurrencyTextField(
    onValueChange: (String) -> Unit,
) {
    var text by remember { mutableStateOf("") }

    BasicTextField(
        value = text,
        onValueChange = { newText: String ->
            if (newText.length <= Long.MAX_VALUE.toString().length && newText.isDigitsOnly()) {
                text = newText
                onValueChange(newText)
            }
        },
        keyboardOptions = KeyboardOptions.Default.copy(
            keyboardType = KeyboardType.Number,
        ),
        visualTransformation = NumberCommaTransformation(),
    )
}

// format long to 123,456,789,9
class NumberCommaTransformation : VisualTransformation {
    override fun filter(text: AnnotatedString): TransformedText {
        return TransformedText(
            text = AnnotatedString(text.text.toLongOrNull().formatWithComma()),
            offsetMapping = object : OffsetMapping {
                override fun originalToTransformed(offset: Int): Int {
                    return text.text.toLongOrNull().formatWithComma().length
                }

                override fun transformedToOriginal(offset: Int): Int {
                    return text.length
                }
            }
        )
    }
}

fun Long?.formatWithComma(): String =
    NumberFormat.getNumberInstance(Locale.US).format(this ?: 0)

https://stackoverflow.com/questions/71333771/

相关文章:

ruby-on-rails - 安装带有 native 扩展 Gem::Ext::BuildErro

flutter - 图标聚集在带有 float 按钮的 flutter 底部导航栏中

r - 一种扩展R向量的有效方法

r - 检查列表中的值是否存在于多列 R data.table 中

R - 如何将多个 bool 列(不知道有多少)组合成一列

python - 独特的骰子组合

swift - RealityKit——在检测到的平面上可视化网格

powershell - 仅添加真实 MAC 地址

bash - 从多个文件中获取字符串并复制到新文件并将文件名打印到 bash 的第二列

r - 在列 R 中包含列表元素