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

Antd InputNumber正则掩码需求:实时插入连字符而非输入完成后生效

解决Antd InputNumber实时插入掩码连字符的问题

要实现InputNumber组件实时插入123-456-789-123格式的连字符,直接用匹配完整长度的正则无法满足实时需求,推荐利用Antd InputNumber自带的formatter和parser属性来处理,既能保证显示格式,又不影响原始值的逻辑处理。

最终实现代码

import React, { useState } from "react";
import "./index.css";
import { InputNumber } from "antd";

const App = () => {
  const [value, setValue] = useState("");

  // 格式化显示文本:每3位插入连字符,避免末尾多余符号
  const formatDisplay = (rawValue) => {
    if (!rawValue) return "";
    // 过滤所有非数字字符
    const pureNumStr = rawValue.toString().replace(/\D/g, "");
    // 每3位数字后插入连字符(仅当后面还有数字时)
    return pureNumStr.replace(/(\d{3})(?=\d)/g, "$1-");
  };

  // 解析输入值:移除所有连字符,返回纯数字字符串
  const parseRawValue = (displayValue) => {
    if (!displayValue) return "";
    return displayValue.replace(/-/g, "");
  };

  return (
    <InputNumber
      value={value}
      onChange={setValue}
      formatter={formatDisplay}
      parser={parseRawValue}
      style={{ width: "220px" }}
    />
  );
};

export default App;

关键逻辑说明

  • formatDisplay函数:负责将原始数字转换为带连字符的显示格式。先过滤掉所有非数字字符,再用正则/(\d{3})(?=\d)/g匹配每3个连续数字(且后面仍有数字),在其后插入连字符,实现输入过程中实时添加分隔符,同时不会在末尾生成多余的连字符。
  • parseRawValue函数:负责将用户输入的带连字符的文本解析为纯数字,确保组件内部维护的value是纯净的数字字符串,方便后续业务逻辑处理。
  • 长度限制(可选):如果需要限制最多输入10位数字,可在formatDisplay中对pureNumStr进行截断:
    const pureNumStr = rawValue.toString().replace(/\D/g, "").slice(0, 10);
    

内容的提问来源于stack exchange,提问作者Натик

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:15:14