Check if a number has a decimal place/is a whole number

JavascriptValidationNumbersInteger

Javascript Problem Overview


I am looking for an easy way in JavaScript to check if a number has a decimal place in it (in order to determine if it is an integer). For instance,

23 -> OK
5 -> OK
3.5 -> not OK
34.345 -> not OK

if(number is integer) {...}

Javascript Solutions


Solution 1 - Javascript

Using modulus will work:

num % 1 != 0
// 23 % 1 = 0
// 23.5 % 1 = 0.5

Note that this is based on the numerical value of the number, regardless of format. It treats numerical strings containing whole numbers with a fixed decimal point the same as integers:

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5

Solution 2 - Javascript

Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger() is part of the ES6 standard and not supported in IE11.

It returns false for NaN, Infinity and non-numeric arguments while x % 1 != 0 returns true.

Solution 3 - Javascript

Or you could just use this to find out if it is NOT a decimal:

string.indexOf(".") == -1;

Solution 4 - Javascript

Simple, but effective!

Math.floor(number) === number;

Solution 5 - Javascript

The most common solution is to strip the integer portion of the number and compare it to zero like so:

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}

Solution 6 - Javascript

//How about byte-ing it?

Number.prototype.isInt= function(){
 return this== this>> 0;
}

I always feel kind of bad for bit operators in javascript-

they hardly get any exercise.

Solution 7 - Javascript

Number.isInteger() is probably the most concise. It returns true if it is an integer, and false if it isn't.

Solution 8 - Javascript

Number.isSafeInteger(value);

In JavaScript, isSafeInteger() is a Number method that is used to return a Boolean value indicating whether a value is a safe integer. This means that it is an integer value that can be exactly represented as an IEEE-754 double precision number without rounding.

Solution 9 - Javascript

number = 20.5

if (number == Math.floor(number)) {

alert("Integer")

} else {

alert("Decimal")

}

Pretty cool and works for things like XX.0 too! It works because Math.floor() chops off any decimal if it has one so if the floor is different from the original number we know it is a decimal! And no string conversions :)

Solution 10 - Javascript

var re=/^-?[0-9]+$/;
var num=10;
re.test(num);

Solution 11 - Javascript

function isDecimal(n){
    if(n == "")
        return false;
    
    var strCheck = "0123456789";
    var i;
    
    for(i in n){
        if(strCheck.indexOf(n[i]) == -1)
            return false;
    }
    return true;
}

Solution 12 - Javascript

parseInt(num) === num

when passed a number, parseInt() just returns the number as int:

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true

Solution 13 - Javascript

convert number string to array, split by decimal point. Then, if the array has only one value, that means no decimal in string.

if(!number.split(".")[1]){
    //do stuff
}

This way you can also know what the integer and decimal actually are. a more advanced example would be.

number_to_array = string.split(".");
inte = number_to_array[0];
dece = number_to_array[1]; 

if(!dece){
    //do stuff
}

Solution 14 - Javascript

Here's an excerpt from my guard library (inspired by Effective JavaScript by David Herman):

var guard = {

    guard: function(x) {
        if (!this.test(x)) {
            throw new TypeError("expected " + this);
        }
    }

    // ...
};

// ...

var number = Object.create(guard);
number.test = function(x) {
    return typeof x === "number" || x instanceof Number;
};
number.toString = function() {
    return "number";
};


var uint32 = Object.create(guard);
uint32.test = function(x) {
    return typeof x === "number" && x === (x >>> 0);
};
uint32.toString = function() {
    return "uint32";
};


var decimal = Object.create(guard);
decimal.test = function(x) {
    return number.test(x) && !uint32.test(x);
};
decimal.toString = function() {
    return "decimal";
};


uint32.guard(1234);     // fine
uint32.guard(123.4);    // TypeError: expected uint32

decimal.guard(1234);    // TypeError: expected decimal
decimal.guard(123.4);   // fine

Solution 15 - Javascript

You can multiply it by 10 and then do a "modulo" operation/divison with 10, and check if result of that two operations is zero. Result of that two operations will give you first digit after the decimal point. If result is equal to zero then the number is a whole number.

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}

Solution 16 - Javascript

function isDecimal(num) {
  return (num !== parseInt(num, 10));
}

Solution 17 - Javascript

You can use the bitwise operations that do not change the value (^ 0 or ~~) to discard the decimal part, which can be used for rounding. After rounding the number, it is compared to the original value:

function isDecimal(num) {
  return (num ^ 0) !== num;
}

console.log( isDecimal(1) ); // false
console.log( isDecimal(1.5) ); // true
console.log( isDecimal(-0.5) ); // true

Solution 18 - Javascript

function isWholeNumber(num) {
  return num === Math.round(num);
}

Solution 19 - Javascript

Use following if value is string (e.g. from <input):

Math.floor(value).toString() !== value

I add .toString() to floor to make it work also for cases when value == "1." (ends with decimal separator or another string). Also Math.floor always returns some value so .toString() never fails.

Solution 20 - Javascript

Function for check number is Decimal or whole number

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

    if (p_decimalNumber % 1 == 0)
        l_boolIsExist = false;

    return l_boolIsExist;
}

Solution 21 - Javascript

Perhaps this works for you?

It uses regex to check if there is a comma in the number, and if there is not, then it will add the comma and stripe.

var myNumber = '50';
function addCommaStripe(text){
	if(/,/.test(text) == false){
		return text += ',-';
	} else {
		return text;
	}
}
myNumber = addCommaStripe(myNumber);

Solution 22 - Javascript

When using counters with decimal steps, checking if number is round will actually fail, as shown below. So it might be safest (although slow) to format the number with 9 (could be more) decimal places, and if it ends with 9 zeros, then it's a whole number.

const isRound = number => number.toFixed(9).endsWith('000000000');

for (let counter = 0; counter < 2; counter += 0.1) {
  console.log({ counter, modulo: counter % 1, formatted: counter.toFixed(9), isRound: isRound(counter) });
}

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
QuestionBj&#246;rnView Question on Stackoverflow
Solution 1 - JavascriptAndy EView Answer on Stackoverflow
Solution 2 - Javascriptle_mView Answer on Stackoverflow
Solution 3 - JavascriptIkeView Answer on Stackoverflow
Solution 4 - JavascriptdYaleView Answer on Stackoverflow
Solution 5 - JavascriptThomasView Answer on Stackoverflow
Solution 6 - JavascriptkennebecView Answer on Stackoverflow
Solution 7 - JavascriptChristopher ConneryView Answer on Stackoverflow
Solution 8 - JavascriptaadityaView Answer on Stackoverflow
Solution 9 - Javascriptuser7873306View Answer on Stackoverflow
Solution 10 - Javascriptghostdog74View Answer on Stackoverflow
Solution 11 - JavascriptVitor LinsView Answer on Stackoverflow
Solution 12 - JavascriptMichaelView Answer on Stackoverflow
Solution 13 - JavascriptKareemView Answer on Stackoverflow
Solution 14 - JavascriptschirrmacherView Answer on Stackoverflow
Solution 15 - JavascriptBSevoView Answer on Stackoverflow
Solution 16 - JavascriptSteve BrushView Answer on Stackoverflow
Solution 17 - JavascriptmakovkastarView Answer on Stackoverflow
Solution 18 - JavascriptDmitry ShashurovView Answer on Stackoverflow
Solution 19 - Javascriptmichal.jakubeczyView Answer on Stackoverflow
Solution 20 - Javascriptuser3897934View Answer on Stackoverflow
Solution 21 - Javascriptuser11608734View Answer on Stackoverflow
Solution 22 - Javascriptdomaci_a_nasView Answer on Stackoverflow