簡體   English   中英

java.lang.NumberFormatException:KeyboardType.Decimal 的多個點

[英]java.lang.NumberFormatException: multiple points with KeyboardType.Decimal

我在下面顯示的OutlinedTextFieldkeyboardOptions條目中使用KeyboardType.Decimal作為鍵盤類型,但它允許在鍵入的數字中使用多個小數。 對諸如"2.5.8".toDouble()這樣的輸入進行任何轉換都會引發如下所示的multiple points異常。 我怎樣才能確保只允許一個小數點並且任何后續的小數鍵按下都不會做任何事情?

可組合

CustomOutlinedTextField(
    fieldModifier = Modifier
        .width(100.dp)
        .onFocusChanged {
            if (!it.isFocused) {
                if (mainViewModel.shoppingListItemState.value.quantity == "" || mainViewModel.shoppingListItemState.value.quantity == "0") {
                    mainViewModel.setStateValue(
                        ITEM_QUANTITY_STR,
                        "1"
                    )
                }
            }
        }
        .onPreviewKeyEvent {
            if (it.key == Key.Tab && it.nativeKeyEvent.action == ACTION_DOWN) {
                focusManager.moveFocus(FocusDirection.Right)
                true
            } else {
                false
            }
        },
    label = ITEM_QUANTITY_STR,
    inputVal = mainViewModel.shoppingListItemState.value.quantity,
    isSingleLine = true,
    keyboardOptions = KeyboardOptions.Default.copy(
        capitalization = KeyboardCapitalization.None,
        autoCorrect = false,
        keyboardType = KeyboardType.Decimal,
        imeAction = ImeAction.Next
    ),
    keyboardActions = KeyboardActions(
        onNext = { focusManager.moveFocus(FocusDirection.Right) }
    )
) { value ->
    mainViewModel.setStateValue(ITEM_QUANTITY_STR, value)
}

例外

 java.lang.NumberFormatException: multiple points

您可以在TextFielddecimalSeparator中檢查onValueChange的數量,並且只允許一個。 建議獲取decimalSeparator而不是與. 因為它可能會根據設備區域設置而改變。 下面是一個TextField的示例實現,它只檢查並允許一個decimalSeparator

val decimalFormat = DecimalFormat.getInstance(Locale.getDefault()) as DecimalFormat
val decimalSeparator = decimalFormat.decimalFormatSymbols.decimalSeparator

var text by remember { mutableStateOf("123") }

TextField(
    value = text,
    keyboardOptions = KeyboardOptions.Default.copy(
        keyboardType = KeyboardType.Decimal
    ),
    onValueChange = { value ->
        val counter = value.count { it == decimalSeparator }
        if (counter <= 1) { text = value }}
)

您可以在onValueChange中使用正則表達式將允許的字符限制為十進制數。

就像是:

val pattern = remember { Regex("^\\d*\\.?\\d*\$") }

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

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM