You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native TextInput限制两位小数:如何阻止第三位小数显示?

React Native TextInput 限制两位小数且禁止显示第三位小数的实现方案

问题根源是你的handleInputChange大概率是在输入完成后再过滤非法内容,导致非法内容短暂显示后被替换。要彻底解决,需要在输入阶段就拦截非法内容,只让符合规则的内容更新到状态中,这样TextInput的value始终是合法值,不会出现闪烁现象。

具体实现代码

修改handleInputChange函数,添加严格的输入校验逻辑:

import { useState } from 'react';
import { TextInput, StyleSheet } from 'react-native';

export default function App() {
  const [displayValue, setDisplayValue] = useState('');

  const handleInputChange = (inputText) => {
    // 正则规则:允许空输入、整数、1位小数、2位小数,禁止多个小数点和超过2位的小数
    const validPattern = /^\d*\.?\d{0,2}$/;
    // 仅当输入内容符合规则时,才更新状态
    if (validPattern.test(inputText)) {
      setDisplayValue(inputText);
    }
    // 不符合规则则不更新状态,TextInput保持原有合法值
  };

  return (
    <TextInput
      value={displayValue}
      onChangeText={handleInputChange}
      style={styles.input}
      keyboardType="decimal-pad"
      selection={{
        start: displayValue.length,
        end: displayValue.length,
      }}
    />
  );
}

const styles = StyleSheet.create({
  input: {
    height: 40,
    borderWidth: 1,
    padding: 10,
    marginTop: 50,
  },
});

关键逻辑说明

  • 正则校验规则:/^\d*\.?\d{0,2}$/
    • ^\d*:开头允许0个或多个数字(支持空输入或整数)
    • \.?:最多允许1个小数点(禁止多个小数点输入)
    • \d{0,2}:小数点后最多保留2个数字
  • 状态更新控制:只有输入内容符合规则时才更新displayValue,输入第三位小数时因不符合规则,状态不会变化,TextInput自然不会显示非法内容
  • 光标体验优化:保留你原有的selection设置,确保光标始终停在内容末尾

可选:支持货币符号(如€)的优化

如果需要在输入后拼接货币符号,可调整处理逻辑:

const handleInputChange = (inputText) => {
  // 先过滤掉非数字和小数点的字符
  const cleanedText = inputText.replace(/[^0-9.]/g, '');
  const validPattern = /^\d*\.?\d{0,2}$/;
  if (validPattern.test(cleanedText)) {
    // 拼接货币符号并更新状态
    setDisplayValue(`${cleanedText} €`);
  }
};

内容的提问来源于stack exchange,提问作者Patrik Vala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:34:56