首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >强制类型为number的TextField将点显示为小数点分隔符

强制类型为number的TextField将点显示为小数点分隔符
EN

Stack Overflow用户
提问于 2019-11-05 21:37:47
回答 3查看 13K关注 0票数 7

我正在使用material-ui在我的react应用程序中呈现TextField组件。它以某种方式强制所有<TextField type="number />使用小数分隔符作为逗号(,)而不是点(.)这对目标用户来说是令人困惑的。

有没有办法强制它始终以点作为小数点分隔符,而不管语言环境如何?

我已经创建了一个small example here。只需尝试输入一个带有小数的数字,然后单击外部,它会将其转换为逗号。这可能是因为我当前的设备区域设置,但我仍然想强制每个人都使用一个点。

EN

回答 3

Stack Overflow用户

发布于 2019-11-06 18:51:39

按照我的建议,使用第三方库来集成到Textfield组件中;您可以使用react-number-format库作为Textfield的inputProp。它之所以有效,是因为上面提到的库提供的数字格式化程序有一个缺省为一个字符串"."decimalSeparator属性

自定义数字格式化程序如下所示:

代码语言:javascript
复制
import NumberFormat from 'react-number-format';

interface NumberFormatCustomProps {
  inputRef: (instance: NumberFormat | null) => void;
  onChange: (event: { target: { value: string } }) => void;
}

function NumberFormatCustom(props: NumberFormatCustomProps) {
  const { inputRef, onChange, ...other } = props;

  return (
    <NumberFormat
      {...other}
      getInputRef={inputRef}
      onValueChange={values => {
        onChange({
          target: {
            value: values.value
          }
        });
      }}
      isNumericString
    />
  );
}

它可以用在数字文本字段中,如下所示:

代码语言:javascript
复制
<TextField
      label="react-number-format"
      value={values.numberformat}
      onChange={handleChange("numberformat")}
      id="formatted-numberformat-input"
      InputProps={{
        inputComponent: NumberFormatCustom as any
      }}
      type="number"
/>

要获得完整的功能示例,请查看此sandbox

票数 0
EN

Stack Overflow用户

发布于 2021-07-16 23:15:16

对我来说,在inputProps中将language属性设置为"en-US"是可行的:

代码语言:javascript
复制
<TextField
    type="number"
    inputProps={{step: "0.1", lang:"en-US"}}
 />
票数 0
EN

Stack Overflow用户

发布于 2021-11-11 08:41:26

我提出了一个同时接受和的解决方案。分隔符使用正则表达式验证器。

除了控制输入标签之外,我还控制外部数字状态。

在我的解决方案中,用户只能输入分隔的小数。或者,只有当用户输入可转换为浮点型时,输入标签和数字状态才会改变,如果输入为空"“,则数字状态设置为null。

代码语言:javascript
复制
    const [inputValue, setInputValue] = useState<string>("")
    const [numericValue, setNumericValue] = useState<number | null>(null)

         return (<TextField
                    inputMode={"numeric"}
                    onChange={(e) => {
                        e.preventDefault();
                        // if new value is valid float
                        if (/^([\d]*[,.]?[\d]{0,2})$/.test(e.target.value)) {
                            setInputValue(e.target.value);
                            const parsed = parseFloat(
                                e.target.value.replaceAll(",", ".")
                            );
                            setNumericValue(isNaN(parsed) ? null : parsed)
                        }
                    }}
                    value={inputValue}
                />);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58712520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档