How to block +,- and e in Number Input
Narender Saini

Narender Saini @narendersaini32

About: I am Senior Reactjs developer with 4 year of experience. Apart from freelancing work I am a mentor teaching 100's of students around the globe. I love to share knowledge regarding Reactjs.

Location:
India
Joined:
Feb 28, 2020

How to block +,- and e in Number Input

Publish Date: Jun 20 '20
58 8

How to block +,- and e in Number Input

Have you ever used number input and added special logic on onChange event to prevent +, – and e charterers saving to state. In this article we will gonna learn how to write a util function to block these +, – and e in your number input.

Problem

Let’s see below example.



import React, { useState } from "react";
import "./styles.css";

export default function App() {
  const [value, setValue] = useState("");
  return (
    <div className="App">
      <input
        type="Number"
        value={value}
        onChange={({ target: { value } }) => {
          setValue(value);
        }}
      />
    </div>
  );
}



Enter fullscreen mode Exit fullscreen mode

If you notice we are using a number input and it’s also working fine but we don’t want user to enter +, – and e while typing.

How to block +,- and e in Number Input

Solution

The solution is very straight forward. We will gonna write a reusable util function which basically gonna block invalid characters.



export const blockInvalidChar = e => ['e', 'E', '+', '-'].includes(e.key) && e.preventDefault();



Enter fullscreen mode Exit fullscreen mode

We can simply import this function and use it on onKeyPress event.



import React, { useState } from "react";

import { blockInvalidChar } from "./blockInvalidChar";
import "./styles.css";

export default function App() {
  const [value, setValue] = useState("");
  return (
    <div className="App">
      <input
        type="Number"
        value={value}
        onKeyDown={blockInvalidChar}
        onChange={({ target: { value } }) => {
          setValue(value);
        }}
      />
    </div>
  );
}



Enter fullscreen mode Exit fullscreen mode

How to block +,- and e in Number Input

Edit k63s4

How to use Formik with yup in React

Comments 8 total

  • Saurabh Sharma
    Saurabh SharmaJun 20, 2020

    I used to cast value to number explicitly using Number(e.target.value).

  • Stephan Nijman
    Stephan NijmanJun 20, 2020

    I'm not sure if this is a problem in React, but in my experience with vanilla js and the onkeydown event it sometimes misses the last typed character (In some browsers). If you see this poblem just use the onkeyup event instead! :)

  • Mariusz Wachowski
    Mariusz WachowskiNov 30, 2020

    When using onKeyDown user cannot use many keys like:

    • TAB (move caret to next input)
    • ALT+A (selecting all)
    • CTRL+C/CTRL+V/CTRL+X
    • arrows (up/down to add/subtract one, left right to move caret)
    • home, end, page up, page down to move caret
    • etc.

    You should rather check value onChange.

  • Ujjwal Thakur
    Ujjwal ThakurNov 5, 2022

    I used this, and it worked perfectly.

  • Harsh Malviya
    Harsh MalviyaDec 11, 2022

    This works fine when user is entering the value using keyboard.
    But when the user scrolls the mouse on input this doesn't work. Is there a way to block that as well?

    • vinay
      vinayMay 18, 2023

      Add this -- >

      const numberInputOnWheelPreventChange = (e: any) =>
      {
      // Prevent the input value change
      e.target.blur();
      // Prevent the page/container scrolling
      e.stopPropagation();
      // Refocus immediately, on the next tick (after the current
      // function is done)
      setTimeout(() => {
      e.target.focus();
      }, 0);
      };

  • Agustinus Nathaniel
    Agustinus NathanielMar 6, 2023

    This is simple and useful!

  • Carolina
    CarolinaFeb 9, 2024

    Could you try this on mobile please? On mobile it keeps accepting plus, minus and dot characters.

    Thanks.

Add comment