android KeyboardType.Number和KeyboardType.Decimal都允许键入小数点分隔符

643ylb08  于 2023-04-04  发布在  Android
关注(0)|答案(2)|浏览(132)

所以我只允许在字段中键入数字。
配置TextField

keyboardOptions = KeyboardOptions.Default.copy(
    keyboardType = KeyboardType.Number
)

但它仍然允许我键入小数点分隔符(逗号和点)
所以我看不出KeyboardType.NumberKeyboardType.Decimal之间有什么区别,它们的工作原理完全一样。
数量

@Stable
public final val Number: KeyboardType
A keyboard type used to request an IME that is capable of inputting digits. IME may provide inputs other than digits but it is not guaranteed.

十进制

@Stable
public final val Decimal: KeyboardType
A keyboard type used to request an IME that is capable of inputting decimals. IME should explicitly provide a decimal separator as input, which is not assured by KeyboardType.Number.

为什么会这样呢?

1szpjjfi

1szpjjfi1#

issue所述:

大多数键盘在键盘类型设置为Number时会显示小数点分隔符,但也有可能是键盘在inputType中期望TYPE_NUMBER_FLAG_DECIMAL标志实际显示小数点分隔符键。

此更改添加了一个名为Decimal的新KeyboardType,它显式设置所需的标志。对于大多数键盘和OEM,Number和Decimal的行为基本相同
您可以使用正则表达式模式限制允许的字符。
比如:

val pattern = remember { Regex("^\\d+\$") }

TextField(
    value = text,
    onValueChange = {
        if (it.isEmpty() || it.matches(pattern)) {
            text = it
        }
    },
    keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
pgvzfuti

pgvzfuti2#

使用KeyboardType.NumberPassword只向用户显示数字,仅用于输入0到9之间的数字,非常方便输入没有小数点的金额。这可以防止显示用户不允许输入的逗号或破折号。
只有当您希望知道这是防止04或001等条目的确切数量时,才需要使用模式。在这种情况下,正则表达式应该是^[1-9]\d*$
https://stackoverflow.com/a/5661603/5457853

相关问题