skt9
skt9

Reputation: 1

How to check if the input taken by the user doesn't contain decimal?

I am a newbie to C++. I have a situation where the input integer is taken from the user. However, I need to check if the user enters a decimal value. How do I check this?

I have tried cin.good(), cin.fail() but they are detecting only non-digit entries and not decimal numbers. Any help would be appreciated.

#include <iostream>

int main()
{
  using namespace std;
  int x;
  cout << "Enter an integer: " << endl;
  cin >> x;

  if (cin.good()) {
    cout << "input is an integer" << endl;
  }
  else 
    cout << "input is not an integer" << endl;
}

Here's my output:

1.

Enter an integer: 
1.2
input is an integer

2.

Enter an integer: 
a
input is not an integer

Upvotes: 0

Views: 3664

Answers (3)

legends2k
legends2k

Reputation: 32934

You receive the input as an int from cin and hence any float entered would already be truncated by the time you get your hands on it. You should receive it as a float or a string to decide on the validity of the input.

Removed the earlier answer since it went down the slippery route of manually parsing the input which is unnecessary and error-prone. The standard library already has multiple ways to check if an input is a valid number. Two ways that I know: C++ streams and the C library function strtof. Here's an example using the latter:

#include <iostream>
#include <string>
#include <cmath>

bool is_int(float f) {
    return std::floor(f) == f;
}    

int main()
{
    std::cout << "Enter an integer: ";
    std::string input;
    std::cin >> input;
    char *e = nullptr;
    char const *str = input.c_str();
    float const f = strtof(str, &e);
    // no conversion was performed or was stopped as disallowed
    // characters were encountered: Not A Number
    if ((e == str) || (*e != '\0'))
        std::cout << "NAN";
    else if ((f == HUGE_VALF) || !std::isfinite(f))
        std::cout << "too large";
    else
        std::cout << (is_int(f) ? "integer" : "non-integer");
    std::cout << '\n';
}

Live example.

To check if the input is a number, this

float f;
cin >> f;

is possible too, but it will also accept NANs as valid input e.g. 45dsf will be converted to 45. One has to then check if the conversion happened completely and successfully by checking the fail and eof bits of the stream.

See also

Upvotes: 0

Arkady
Arkady

Reputation: 2207

You can use std::isdigit for checking your string input next way.

  bool is_numeric(const std::string& str)
  {
     std::string::const_iterator it = str.begin();
     if (it != str.end() && *it == '-') ++it;
     if (it == str.end()) return false;
     while (it != str.end() && std::isdigit(*it)) ++it;
     return it == str.end();
  }

It's not hard to change it to work with floating points, if needs, but that function will exactly checks what you need.

Upvotes: 1

Ivan Rubinson
Ivan Rubinson

Reputation: 3339

float x = 4.2;
if (x == (int) x)
{
    // int
}
else
{
    // not int
}

Upvotes: 1

Related Questions