Prevent negative inputs in form input type="number"?

HtmlFormsInputNumbers

Html Problem Overview


I want to restrict user input to positive numbers in an html form.

I know you can set min="0", however it is possible to bypass this by manually entering a negative number.

Is there any other way to solve this without writing a validation function?

Html Solutions


Solution 1 - Html

This uses Javascript, but you don't have to write your own validation routine. Instead just check the validity.valid property. This will be true if and only if the input falls within the range.

<html>
<body>
<form action="#">
  <input type="number" name="test" min=0 oninput="validity.valid||(value='');"><br>
  <input type="submit" value="Submit">
</form>
</body>
</html>

Solution 2 - Html

This is not possible without validating the value of the input.

>#input type=number

>The input element with a type attribute whose value is "number" represents a precise control for setting the element’s value to a string representing a number.

Since it is a string representing the number there is no way to be sure that string may be representing numeric values or not.

The Permitted attributes will not give you the ability to validate the value of the number input control.

One way to do this with the help of JavaScript could look like this.

// Select your input element.
var numInput = document.querySelector('input');

// Listen for input event on numInput.
numInput.addEventListener('input', function(){
    // Let's match only digits.
    var num = this.value.match(/^\d+$/);
    if (num === null) {
        // If we have no match, value will be empty.
        this.value = "";
    }
}, false)

<input type="number" min="0" />

If you are planing on sending your data to a server make sure to validate the data on the server as well. Client side JavaScript can not ensure that the data that is being sent will be what you expect it to be.

Solution 3 - Html

If you want to ensure default value, i.e min value, or any other value, this is working solution. This is also preventing to clear the input field. Same way you can set to it's max value as well.

<input type="number" min="1" max="9999" maxlength="4" oninput="this.value=this.value.slice(0,this.maxLength||1/1);this.value=(this.value   < 1) ? (1/1) : this.value;">

Solution 4 - Html

The following script will only allow numbers or a backspace to be entered into the input.

var number = document.getElementById('number');

number.onkeydown = function(e) {
    if(!((e.keyCode > 95 && e.keyCode < 106)
      || (e.keyCode > 47 && e.keyCode < 58) 
      || e.keyCode == 8)) {
        return false;
    }
}

<input type="number" id="number" min="0">

Solution 5 - Html

type="number" already solves allowing numbers only to be typed as the other answers here point out.

Just for reference: with jQuery you can overwrite negative values on focusout with the following code:

$(document).ready(function(){
    $("body").delegate('#myInputNumber', 'focusout', function(){
        if($(this).val() < 0){
            $(this).val('0');
        }
    });
});

This does not replace server side validation!

Solution 6 - Html

On html put onKeypress event listener

<input type="text" onkeypress="validate(event)">

write the validate function like this:

<script>
    function validate(event) {
      if (event.key == "-") {
        event.preventDefault();
        return false;
      }
    }    
</script>

in case of angularjs pass $event in place of event, i have tested this in angularjs and in javascript

Solution 7 - Html

WAY 01:

Template:

<input name="price" type="number" (keydown)="onKeydown($event)" min="0" required />

file-name.ts:

onKeydown(event: KeyboardEvent): boolean {
    if (!((event.keyCode > 95 && event.keyCode < 106)
      || (event.keyCode > 47 && event.keyCode < 58)
      || event.keyCode === 8)) {
        return false;
    }
    return true;
  }

WAY 02:

Template:

<input name="price" type="number" min="0" oninput="this.value = Math.abs(this.value)" required />

Solution 8 - Html

In HTML5, I like this way. Also it's much suitable with angular.

<input type="number" min="0" oninput="this.value = Math.abs(this.value)">

Solution 9 - Html

Angular | Typescript Syntax

HTML:

<input type="number" (keydown)="onKeyDown($event)">

ts File:

  onKeyDown(e:any):void{
		if(!e)
		  return;
	   console.log('ee',e);
	   if((e.code==='Minus' && e.keyCode==189 && e.key==='-') ||  (e.keyCode==187 && e.key==='+') 
      ||(e.code==='KeyE' && e.keyCode==69 && e.key==='e')){
		e.preventDefault();
	   }
	  }

JavaScript Syntax

<html>

<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

   
</head>

<body>
    <div class="container">
        <h1>Create Account</h1>
        <form id="user" name="user">
            <div class="row">
                <div class="col-6">
                    <label for="fname">First Name*</label>
                    <input type="number" id="fname" placeholder="Enter Your first name" required>
            </div>
            
    </div>
    </form>
    </div>
</body>

</html>

<script>

    $('#fname').keydown(function(e){         
        console.log('evt e.key:::::', e);
        if(e.key=='-' && e.keyCode==189 || e.key=='+' && e.keyCode==187 )
          {
            e.preventDefault();
          }
        console.log('evt e.keyCode:::::', e.keyCode);
        console.log('evt e.code:::::', e.code);

    });
  
</script>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAliView Question on Stackoverflow
Solution 1 - HtmlMikel RychliskiView Answer on Stackoverflow
Solution 2 - HtmlDavidDomainView Answer on Stackoverflow
Solution 3 - Htmluser7135197View Answer on Stackoverflow
Solution 4 - Htmluser4639281View Answer on Stackoverflow
Solution 5 - HtmlHafenkranichView Answer on Stackoverflow
Solution 6 - HtmlriteshView Answer on Stackoverflow
Solution 7 - HtmliamdiptaView Answer on Stackoverflow
Solution 8 - HtmlMajedurView Answer on Stackoverflow
Solution 9 - HtmlZia KhanView Answer on Stackoverflow