How to prevent keypress two digits after a decimal number?

html, javascript, jquery, textinput

Solution

You can handle the key event before `keyup` on `keypress`, if the input is not to our liking we can disable the event from occurring. Something like this:

Update

Unfortunately my original answer below fails on certain numbers that can't be represented accurately as a float. Here is another solution that checks the position of the `'.'` character against the length of the string with a handy helper function.

jsFiddle

$('.decimal').keypress(function (e) {
    var character = String.fromCharCode(e.keyCode)
    var newValue = this.value + character;
    if (isNaN(newValue) || hasDecimalPlace(newValue, 3)) {
        e.preventDefault();
        return false;
    }
});

function hasDecimalPlace(value, x) {
    var pointIndex = value.indexOf('.');
    return  pointIndex >= 0 && pointIndex < value.length - x;
}

Original answer

jsFiddle

$('.decimal').keypress(function (e) {
    var character = String.fromCharCode(e.keyCode)
    var newValue = this.value + character;
    if (isNaN(newValue) || parseFloat(newValue) * 100 % 1 > 0) {
        e.preventDefault();
        return false;
    }
});

Note that `parseFloat(newValue) * 100 % 1 > 0` evaluates to true if `newValue` contains a number that has more than 2 decimal places.

Problem

I have got a task to prevent keypress two digits after a decimal number. My jquery file is ``` $(function(){ $('#name').bind('paste', function(){ var self = this; setTimeout(function() { if(!/^[a-zA-Z]+$/.test($(self).val())) $(self).val(''); }, 0); }); $('#salary').bind('paste', function(){ var self = this; setTimeout(function() { if(!/^\d*(\.\d{1,2})+$/.test($(self).val())) $(self).val(''); }, 0); }); $('.decimal').keyup(function(){ var val = $(this).val(); if(isNaN(val)){ val = val.replace(/[^0-9]./g,''); if(val.split('.').length>2) val =val.replace(/\.+$/,""); } $(this).val(val); }); }); ``` My html page is ``` <b>Name</b> <input type="text" id="name" /><br/> <b>Salary</b> <input type="text" id="salary" class="decimal" /> ``` here i want only write 2 digits after decimal,how can i do this? You can see my code in http://jsfiddle.net/V6s4B/

Original source

Related problems