5

I have a number stored in my React state, and I want to edit it using an <input type="number" />. Here's my attempt:

function MyNumberInput() {
  const [number, setNumber] = useState(42);

  return (
    <input
      type="number"
      value={number}
      onChange={event => {
        setNumber(parseFloat(event.target.value)); // Convert string value to a number!
      }}
    />
  );
}

Try it on JSFiddle.

The problem is that this code fails during intermediate, non-number states. If I want to enter -12, I begin by typing the negative sign. When I do, the onChange handler fires, parseFloat("-") returns NaN, and the input remains empty. As a user, it feels like my input was completely ignored.

4
  • 2
    parseFloat is unnecessary, please remove Commented Mar 18, 2020 at 2:36
  • Is parsing actually required? parseFloat is being used in some edge cases I believe. Commented Mar 18, 2020 at 2:40
  • 1
    @iamhuynq event.target.value is a string, even for an input with type="number". I want to save a number in state. Commented Mar 18, 2020 at 2:45
  • You can also use setNumber(Math.trunc(event.target.value)) Commented Mar 18, 2020 at 2:57

3 Answers 3

1
  1. You may want to remove the below props to enable non-number content input.
type="number"
  1. And remove the parseFloat to store the string like - or .0
import React, { useState } from "react";

import "./styles.css";
export default function App() {
  const [number, setNumber] = useState('');
  return (
    <div className="App">
      <input
        value={number}
        onChange={event => {
          // console.log(event.currentTarget.value);
          setNumber(event.target.value);
        }}
      />
    </div>
  );
}

enter image description here

Try it online:

Edit charming-sun-nyye3

Sign up to request clarification or add additional context in comments.

2 Comments

This doesn't solve the original problem. I need the input to allow temporarily storing non-number values like - or .. This is required so that users can type -12 or .5 uninterrupted.
@PullJosh Answer updated, kindly check it would be appreciated
0

just use unary plus operator to convert a string into a number like this:

function MyNumberInput() {
  const [number, setNumber] = useState(42);

  return (
    <input
      type="number"
      value={number}
      onChange={event => {
        setNumber(+(event.target.value)); // Convert string value to a number!
      }}
    />
  );
}

Comments

0

Use RegEx

The problem is the input get NaN is because the input type="number" and - or . is not a number.

I suggest to use RegEx:

function MyNumberInput() {
  const [number, setNumber] = useState(42);

  const updateNumber = ({ target }) => {
    const reg = new RegExp('^[0-9+-/]+$|^$');
    if (reg.test(target.value)) setNumber(target.value);
  };

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.