撰写信用卡格式文本字段

问题描述 投票:0回答:1

我正在尝试制作一个信用格式文本字段。一切正常,直到您填满所有字符然后尝试删除一些字符。对我做错了什么有什么想法吗?

    // XXXX-XXXX-XXXX-XXXX
var text by remember { mutableStateOf("") }
OutlinedTextField(
    value = text,
    onValueChange = {
        if(text.length <=16)
            text = it
    },
    visualTransformation = object : VisualTransformation {
        override fun filter(text: AnnotatedString): TransformedText {
            val trimmed = if (text.text.length >= 16) text.text.substring(0..15) else text.text
            var out = ""

            for (i in trimmed.indices) {
                out += trimmed[i]
                if (i % 4 == 3 && i != 15) out += "-"
            }
            return TransformedText(
                AnnotatedString(out),
                creditCardOffsetMapping
            )
        }
    }
)

// Making XXXX-XXXX-XXXX-XXXX string.
val creditCardOffsetMapping = object : OffsetMapping {
    override fun originalToTransformed(offset: Int): Int {
        if (offset <= 3) return offset
        if (offset <= 7) return offset + 1
        if (offset <= 11) return offset + 2
        if (offset <= 16) return offset + 3
        return 19
    }

    override fun transformedToOriginal(offset: Int): Int {
        if (offset <= 4) return offset
        if (offset <= 9) return offset - 1
        if (offset <= 14) return offset - 2
        if (offset <= 19) return offset - 3
        return 16
    }
}
android kotlin android-jetpack-compose textfield
1个回答
0
投票

简介

用户在 Kotlin 中遇到信用卡格式文本字段的问题。当达到最大长度后尝试删除字符时会出现问题。在这个答案中,我将提供一个更正的代码解决方案来解决这个问题。

更正代码

让我们首先展示信用卡格式文本字段的更正代码:


    var text by remember { mutableStateOf("") }
    
    OutlinedTextField(
        value = text,
        onValueChange = {
            // Only allow digits and "-"
            val formattedText = it.filter { char -> char.isDigit() || char == '-' }
            
            // Limit the length to 19 characters (to allow for 16 digits and 3 hyphens)
            if (formattedText.length <= 19) {
                text = formattedText
            }
        },
        keyboardOptions = KeyboardOptions(
            keyboardType = KeyboardType.Number
        ),
        visualTransformation = object : VisualTransformation {
            override fun filter(text: AnnotatedString): TransformedText {
                val trimmed = if (text.text.length >= 19) text.text.substring(0..18) else text.text
                var out = ""
    
                for (i in trimmed.indices) {
                    out += trimmed[i]
                    if (i % 5 == 3 && i != 18) out += "-"
                }
                return TransformedText(
                    AnnotatedString(out),
                    creditCardOffsetMapping
                )
            }
        }
    )

此更新的代码有效解决了 Kotlin 中信用卡格式文本字段中的字符删除问题。它允许用户输入和删除字符,同时保持所需的格式(XXX-XXX-XXX-XXX-XXX)。

其他提示:

  1. 确保将 KeyboardOptions 设置为 KeyboardType.Number 以将输入限制为数字字符。
  2. 考虑实施输入验证以确保输入的数据是有效的信用卡号。
© www.soinside.com 2019 - 2024. All rights reserved.