How do I check if a value is a whole number (integer) or contains a decimal? In Javascript we have isInteger but I couldn't find the equivalent in Dart.

We seem to have checks for isEven, isOdd, isFinite, isInfinite, isNaN and isNegative but no isInteger?


Solution 1: Sharad Paghadal

void main() {
int a = 10;
print(a is int); // Prints true
}

OR

void main() {
  dynamic a = 10;
  print(a is int ? a/10 :"Not an int"); // Prints 1
}


Solution 2: lrn

Dart numbers (the type num) are either integers (type int) or doubles (type double).

It is easy to check if a number is an int, just do value is int.

The slightly harder task is to check whether a double value has an integer value, or no fractional part. There is no simple function answering that, but you can do value == value.roundToDouble(). This removes any fractional part from the double value and compares it to the original value. If they are the same, then there was no fractional part.

So, a helper function could be:

bool isInteger(num value) => 
    value is int || value == value.roundToDouble();

I use roundToDouble() instead of just round() because the latter would also convert the value to an integer, which may give a different value for large double values.


Solution 3: kine

Use the modulo operator %:

  bool isInteger(num value) => (value % 1) == 0;

Same as an extension method:

  extension NumExtensions on num {
    bool get isInt => (this % 1) == 0;
  }

Usage:

  double d = 2.6;
  double d2 = 2.0;
  int i = 2;
  print(d.isInt); // returns false
  print(d2.isInt); // returns true
  print(i.isInt); // returns true


Solution 4: Michał Powłoka

I did it like this and works just fine:

bool _isInteger(double value) => value == value.toInt();

Method toInt() drops the decimal part, so if after dropping this part nothing changed, it means it is an integer.