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

React + TypeScript实现BRL货币输入掩码需求求助

React + TypeScript 实现巴西雷亚尔(BRL)货币输入掩码

因为你用的是受控数字输入,要加BRL掩码得处理显示格式字符串和实际数字值的分离——state存数字,输入框显示格式化后的货币字符串,同时处理用户输入的解析。

方案一:自定义工具函数(完全可控)

先写两个核心工具函数,负责数字和BRL格式的互转:

// 把数字转成BRL货币格式字符串
const formatBRL = (value: number | null): string => {
  if (!value) return '';
  return new Intl.NumberFormat('pt-BR', {
    style: 'currency',
    currency: 'BRL',
    minimumFractionDigits: 2,
  }).format(value);
};

// 把BRL格式字符串解析成数字
const parseBRL = (formattedValue: string): number => {
  // 移除货币符号、千分位点,把逗号换成小数点
  const cleaned = formattedValue.replace(/[R$\s.]/g, '').replace(',', '.');
  return parseFloat(cleaned) || 0;
};

然后修改你的组件使用逻辑,把输入框类型改成text(因为number类型没法显示货币符号、逗号这些非数字字符):

import { useState, useEffect } from 'react';

// 假设你的初始state
const [rawValue, setRawValue] = useState<number>(0);
const [displayValue, setDisplayValue] = useState<string>('');

// 初始化或rawValue变化时更新显示值
useEffect(() => {
  setDisplayValue(formatBRL(rawValue));
}, [rawValue]);

const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  const parsedNumber = parseBRL(e.target.value);
  setRawValue(parsedNumber);
  // 实时同步显示格式
  setDisplayValue(formatBRL(parsedNumber));
};

// 渲染组件
<InputAnimation
  required
  type="text"
  placeholder=" "
  label="Valor"
  onChange={handleInputChange}
  value={displayValue}
/>

方案二:用现成的TS友好库(快捷省事)

用react-input-mask,这个库原生支持TypeScript,不用自己写掩码逻辑:

  1. 安装依赖
npm install react-input-mask @types/react-input-mask
  1. 包裹你的InputAnimation组件使用:
import InputMask from 'react-input-mask';
import { useState } from 'react';

const [rawValue, setRawValue] = useState<number>(0);

const MaskedCurrencyInput = () => (
  <InputMask
    mask="R$ 999.999.999,99"
    maskChar=" "
    value={formatBRL(rawValue)}
    onChange={(e) => setRawValue(parseBRL(e.target.value))}
  >
    {/* 把InputAnimation作为子组件传入,继承掩码的输入属性 */}
    {(inputProps) => (
      <InputAnimation
        {...inputProps}
        required
        label="Valor"
        placeholder=" "
      />
    )}
  </InputMask>
);

// 直接渲染这个封装好的组件
<MaskedCurrencyInput />

两种方案选哪种都行:自定义的适合需要完全控制解析/格式化逻辑的场景;用库的省时间,减少重复代码。

内容的提问来源于stack exchange,提问作者Gabriel Donada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:52:27