最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - formatting number in input react - Stack Overflow

programmeradmin2浏览0评论

I have made an Input ponent. If it is a number I want to format it correctly, like a currency. I.e. 4000 would be 4,000.

Here is a codesandbox.

I am having issues with displaying and updating this.

<Input initialValue={'400000000'} isNumber={true} />

My Input ponent looks like this.

type Props = {
    initialValue?: string;
    isNumber?: boolean;
};

const Input = ({ initialValue = '', isNumber }: Props) => {
    const [value, updateValue] = useState(initialValue);

    const update = (val: any) => {
        if (isNumber) {
            const x = Number(val);
            updateValue(x.toLocaleString());
        } else {
            updateValue(val);
        }
    };

    return (
        <StyledInput
            type="text"
            value={value}
            onChange={e => update(e.target.value)}
        />
    );
};

I am seeing an error NaN in my input ponent. Anyone have any ideas?

I have made an Input ponent. If it is a number I want to format it correctly, like a currency. I.e. 4000 would be 4,000.

Here is a codesandbox.

I am having issues with displaying and updating this.

<Input initialValue={'400000000'} isNumber={true} />

My Input ponent looks like this.

type Props = {
    initialValue?: string;
    isNumber?: boolean;
};

const Input = ({ initialValue = '', isNumber }: Props) => {
    const [value, updateValue] = useState(initialValue);

    const update = (val: any) => {
        if (isNumber) {
            const x = Number(val);
            updateValue(x.toLocaleString());
        } else {
            updateValue(val);
        }
    };

    return (
        <StyledInput
            type="text"
            value={value}
            onChange={e => update(e.target.value)}
        />
    );
};

I am seeing an error NaN in my input ponent. Anyone have any ideas?

Share Improve this question edited Jan 31, 2019 at 11:51 peter flanagan asked Jan 31, 2019 at 11:45 peter flanaganpeter flanagan 9,84027 gold badges81 silver badges139 bronze badges 10
  • @Chris He is converting string to Number -> const x = Number(val); – Alwaysblue Commented Jan 31, 2019 at 11:50
  • updateValue is part of the useState hook allowing me to update the state – peter flanagan Commented Jan 31, 2019 at 11:51
  • react-number-format – Şivā SankĂr Commented Jan 31, 2019 at 11:53
  • @ŞivāSankĂr I don't really want to use a library for this – peter flanagan Commented Jan 31, 2019 at 11:54
  • 3 Try const update = (val: any) => { var formatter = new Intl.NumberFormat("en-US"); updateValue(formatter.format(val.replace(/,/g, ""))); }; – Şivā SankĂr Commented Jan 31, 2019 at 12:15
 |  Show 5 more ments

2 Answers 2

Reset to default 2

Javascript has a number formatter (part of the Internationalization API).

    // Quick Solution With Intl.NumberFormat
    const update = (val: any) => {
    var formatter = new Intl.NumberFormat("en-US");         // Intl language tag,
    updateValue(formatter.format(val.replace(/,/g, "")));   //Remove ',' to format number again
    };

Code Snippet:

// Intl.NumberFormat With React State Update

var currentVal = 0;
...
const update = (event: any) => {
   /**
   https://stackoverflow./questions/35535688/stop-cursor-jumping-when-formatting-number-in-react
   https://github./facebook/react/issues/955
   */
   const caret = event.target.selectionStart
      const element = event.target
         window.requestAnimationFrame(() => {
         element.selectionStart = caret
         element.selectionEnd = caret
      })
   // -- Stop cursor jumping when formatting number in React

   var val = event.target.value.replace(/(\..*)\./g, '$1') //Replace Multiple Dot(.)
   var x = Number(val.replace(/,/g, ""));
   if (currentVal != x) {
      var formatter = new Intl.NumberFormat("en-US", { minimumFractionDigits:2});
      currentVal = formatter.format(x);
      updateValue(currentVal);
   }else{
      updateValue(val);
   }
 };

 return (<input type="text" value={value} onChange={e => update(e)} />);

Note : Code Snippet gives you an idea to format numbers, You need to handle few more use-cases for production.

Also check the react-number-format, Which may suit for your application.

Reference :

  • Intl.NumberFormat vs Number.prototype.toLocaleString
  • How can I format numbers as dollars currency string in JavaScript?
  • Intl.NumberFormat | MDN

The problem is in

const x = Number(val);

when you evaluate Number("32,423,343"), a string including mas Js will throw an error... The correct way would be sending the number without mas.. Number("32432343") To solve it you can add this line to remove the mas, before evaluating to a Number..

val = val.replace(/,/g, '');

https://codesandbox.io/s/r0vm8nxvjo

发布评论

评论列表(0)

  1. 暂无评论