Как определить, является ли строка номер с C ++? -- c++ поле с участием visual-c++ пол Связанный проблема

How to determine if a string is a number with C++?


145
vote

проблема

русский

У меня было довольно неприятностей, пытаясь написать функцию, которая проверяет, является ли строка номер. Для игры, которую я пишу, мне просто нужно проверить, является ли строка из файла, которую я читаю, это число или нет (я буду знать, если это параметр таким образом). Я написал функцию ниже, которую я полагаю, работал гладко (или я случайно отредактировал, чтобы остановить его или я шизофренику или окна - шизофреник):

 <код> bool isParam (string line) {     if (isdigit(atoi(line.c_str())))         return true;      return false; }   
Английский оригинал

I've had quite a bit of trouble trying to write a function that checks if a string is a number. For a game I am writing I just need to check if a line from the file I am reading is a number or not (I will know if it is a parameter this way). I wrote the below function which I believe was working smoothly (or I accidentally edited to stop it or I'm schizophrenic or Windows is schizophrenic):

bool isParam (string line) {     if (isdigit(atoi(line.c_str())))         return true;      return false; } 
</div
     
         
         

Список ответов

155
 
vote
vote
Лучший ответ
 

Самым эффективным способом было бы просто переоценить на строку, пока не найдете незначный характер. Если есть какие-либо незначные символы, вы можете рассмотреть строку не число.

 <код> // check whether scrollbar is visible var isScrollbarVisible = window.innerWidth > document.documentElement.clientWidth;  // search for media rule var mediaRule = document.styleSheets[i].cssRules[j];  // update media rule mediaRule.media.mediaText = '..' 3  

Или, если вы хотите сделать это C ++ 11 способ:

 <код> // check whether scrollbar is visible var isScrollbarVisible = window.innerWidth > document.documentElement.clientWidth;  // search for media rule var mediaRule = document.styleSheets[i].cssRules[j];  // update media rule mediaRule.media.mediaText = '..' 4  

Как указано в комментариях ниже, это только работает для положительных целых чисел. Если вам нужно обнаружить отрицательные целые числа или фракции, вы должны пойти с более надежным решением на основе библиотеки. Хотя добавление поддержки отрицательных целых чисел довольно тривиально.

 

The most efficient way would be just to iterate over the string until you find a non-digit character. If there are any non-digit characters, you can consider the string not a number.

bool is_number(const std::string& s) {     std::string::const_iterator it = s.begin();     while (it != s.end() && std::isdigit(*it)) ++it;     return !s.empty() && it == s.end(); } 

Or if you want to do it the C++11 way:

bool is_number(const std::string& s) {     return !s.empty() && std::find_if(s.begin(),          s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end(); } 

As pointed out in the comments below, this only works for positive integers. If you need to detect negative integers or fractions, you should go with a more robust library-based solution. Although, adding support for negative integers is pretty trivial.

</div
 
 
         
         
92
 
vote

Зачем изобретать колесо? Стандартная библиотека C (доступна в C ++) имеет функцию, которая имеет значение именно так:

 <код> // check whether scrollbar is visible var isScrollbarVisible = window.innerWidth > document.documentElement.clientWidth;  // search for media rule var mediaRule = document.styleSheets[i].cssRules[j];  // update media rule mediaRule.media.mediaText = '..' 5  

Если вы хотите обрабатывать фракции или научную запись, перейдите с // check whether scrollbar is visible var isScrollbarVisible = window.innerWidth > document.documentElement.clientWidth; // search for media rule var mediaRule = document.styleSheets[i].cssRules[j]; // update media rule mediaRule.media.mediaText = '..' 6 вместо этого (вы получите <код> // check whether scrollbar is visible var isScrollbarVisible = window.innerWidth > document.documentElement.clientWidth; // search for media rule var mediaRule = document.styleSheets[i].cssRules[j]; // update media rule mediaRule.media.mediaText = '..' 7 результат).

Если вы хотите разрешить шестнадцатеричные и восьмеричные константы в стиле C / C ++ (<код> // check whether scrollbar is visible var isScrollbarVisible = window.innerWidth > document.documentElement.clientWidth; // search for media rule var mediaRule = document.styleSheets[i].cssRules[j]; // update media rule mediaRule.media.mediaText = '..' 8 ), а затем сделайте последний параметр <код> // check whether scrollbar is visible var isScrollbarVisible = window.innerWidth > document.documentElement.clientWidth; // search for media rule var mediaRule = document.styleSheets[i].cssRules[j]; // update media rule mediaRule.media.mediaText = '..' 9 .

Ваша функция может быть записана как

 <код> --replace-media-scrollbar0  
 

Why reinvent the wheel? The C standard library (available in C++ as well) has a function that does exactly this:

char* p; long converted = strtol(s, &p, 10); if (*p) {     // conversion failed because the input wasn't a number } else {     // use converted } 

If you want to handle fractions or scientific notation, go with strtod instead (you'll get a double result).

If you want to allow hexadecimal and octal constants in C/C++ style ("0xABC"), then make the last parameter 0 instead.

Your function then can be written as

bool isParam(string line) {     char* p;     strtol(line.c_str(), &p, 10);     return *p == 0; } 
</div
 
 
         
         
40
 
vote

с компилятором C ++ 11, для неотрицательных целых чисел, я бы использовал что-то вроде этого (обратите внимание на <код> --replace-media-scrollbar1 вместо <код> --replace-media-scrollbar2 ):

 <код> --replace-media-scrollbar3  

http://ideone.com/ojvjwh

 

With C++11 compiler, for non-negative integers I would use something like this (note the :: instead of std::):

bool is_number(const std::string &s) {   return !s.empty() && std::all_of(s.begin(), s.end(), ::isdigit); } 

http://ideone.com/OjVJWh

</div
 
 
 
 
29
 
vote

Вы можете сделать это C ++ путь с Boost :: Lexical_Cast. Если вы действительно настаиваете на том, чтобы не использовать повышение, вы можете просто изучить, что это делает и делает это. Это довольно просто.

 <код> --replace-media-scrollbar4  
 

You can do it the C++ way with boost::lexical_cast. If you really insist on not using boost you can just examine what it does and do that. It's pretty simple.

try  {   double x = boost::lexical_cast<double>(str); // double could be anything with >> operator. } catch(...) { oops, not a number } 
</div
 
 
         
         
16
 
vote

Я просто хотел бросить эту идею, которая использует итерацию, но какой-то другой код делает эту итерацию:

 <код> --replace-media-scrollbar5  

Это не надежно, как будто это должно быть при проверке на десятичную точку или минус знак, поскольку он позволяет там быть более одного из каждого и в любом месте. Хорошее, что это одна строка кода и не требует сторонней библиотеки.

Выньте «.» и '-' Если положительные целые числа все, что разрешены.

 

I just wanted to throw in this idea that uses iteration but some other code does that iteration:

#include <string.h>  bool is_number(const std::string& s) {     return( strspn( s.c_str(), "-.0123456789" ) == s.size() ); } 

It's not robust like it should be when checking for a decimal point or minus sign since it allows there to be more than one of each and in any location. The good thing is that it's a single line of code and doesn't require a third-party library.

Take out the '.' and '-' if positive integers are all that are allowed.

</div
 
 
         
         
16
 
vote
<Р> Я хотел бы предложить регулярное выражение подход. Полный регулярное выражение матча (например, с помощью повышение :: регулярное выражение ) с
 <код> -?[0-9]+([.][0-9]+)?   
<Р> покажет строка является ли число или нет. Это включает в себя положительные и отрицательные числа, целое число, а также десятичной. <Р> Другие варианты:
 <код> [0-9]+([.][0-9]+)?   
<Р> (только положительные)
 <код> -?[0-9]+   
<Р> (только число)
 <код> [0-9]+   
<Р> (только положительное целое число)
 

I'd suggest a regex approach. A full regex-match (for example, using boost::regex) with

-?[0-9]+([.][0-9]+)? 

would show whether the string is a number or not. This includes positive and negative numbers, integer as well as decimal.

Other variations:

[0-9]+([.][0-9]+)? 

(only positive)

-?[0-9]+ 

(only integer)

[0-9]+ 

(only positive integer)

</div
 
 
   
   
13
 
vote
<Р> Вот еще один способ сделать это, используя <код> <regex> Библиотека:
 <код> bool is_integer(const std::string & s){     return std::regex_match(s, std::regex("[(-|+)|][0-9]+")); }   
 

Here's another way of doing it using the <regex> library:

bool is_integer(const std::string & s){     return std::regex_match(s, std::regex("[(-|+)|][0-9]+")); } 
</div
 
 
       
       
12
 
vote
<Р> С помощью этого решения вы можете проверить все, от отрицательных до положительных чисел и чисел с плавающей точкой даже. При изменении типа <код> num в целое число, вы получите сообщение об ошибке, если строка содержит точку.
 <код> #include<iostream> #include<sstream> using namespace std;   int main() {       string s;        cin >> s;        stringstream ss;       ss << s;        float num = 0;        ss >> num;        if(ss.good()) {           cerr << "No Valid Number" << endl;       }       else if(num == 0 && s[0] != '0') {           cerr << "No Valid Number" << endl;       }       else {           cout << num<< endl;       }              }   
<Р> Доказать: C ++
 

With this solution you can check everything from negative to positive numbers and even float numbers. When you change the type of num to integer you will get an error if the string contains a point.

#include<iostream> #include<sstream> using namespace std;   int main() {       string s;        cin >> s;        stringstream ss;       ss << s;        float num = 0;        ss >> num;        if(ss.good()) {           cerr << "No Valid Number" << endl;       }       else if(num == 0 && s[0] != '0') {           cerr << "No Valid Number" << endl;       }       else {           cout << num<< endl;       }              } 

Prove: C++ Program

</div
 
 
10
 
vote
<Р> Я нашел следующий код, чтобы быть самым надежным (с ++ 11). Он ловит как целые и поплавки.
 <код> #include <regex> bool isNumber( std::string token ) {     return std::regex_match( token, std::regex( ( "((\+|-)?[[:digit:]]+)(\.(([[:digit:]]+)?))?" ) ) ); }   
 

I've found the following code to be the most robust (c++11). It catches both integers and floats.

#include <regex> bool isNumber( std::string token ) {     return std::regex_match( token, std::regex( ( "((\+|-)?[[:digit:]]+)(\.(([[:digit:]]+)?))?" ) ) ); } 
</div
 
 
 
 
6
 
vote

Попробуйте:

 <код> isNumber(const std::string &str) {       return !str.empty() && str.find_first_not_of("0123456789") == string::npos; }   
 

Try this:

isNumber(const std::string &str) {       return !str.empty() && str.find_first_not_of("0123456789") == string::npos; } 
</div
 
 
 
 
5
 
vote
<Р> Вот решение для проверки положительных целых чисел:
 <код> [0-9]+([.][0-9]+)? 0  
 

Here is a solution for checking positive integers:

bool isPositiveInteger(const std::string& s) {     return !s.empty() &&             (std::count_if(s.begin(), s.end(), std::isdigit) == s.size()); } 
</div
 
 
4
 
vote
<Р> Брендан это
 <код> [0-9]+([.][0-9]+)? 1  
<Р> почти нормально. <Р> принимать любую строку, начиная с 0 представляет собой число, Просто добавьте чек для этого случая
 <код> [0-9]+([.][0-9]+)? 2  
<Р> ОФК "123hello" возвращает истину, как Тони D отмечено.
 

Brendan this

bool isNumber(string line)  {     return (atoi(line.c_str()));  } 

is almost ok.

assuming any string starting with 0 is a number, Just add a check for this case

bool isNumber(const string &line)  {  if (line[0] == '0') return true;  return (atoi(line.c_str())); } 

ofc "123hello" will return true like Tony D noted.

</div
 
 
3
 
vote
<Р> Простейшая я могу думать в C ++
 <код> [0-9]+([.][0-9]+)? 3  
<Р> Рабочий пример кода: https://ideone.com/nRX51Y
 

The simplest I can think of in c++

bool isNumber(string s) {     if(s.size()==0) return false;     for(int i=0;i<s.size();i++) {         if((s[i]>='0' && s[i]<='9')==false) {             return false;         }     }     return true; } 

Working code sample: https://ideone.com/nRX51Y

</div
 
 
3
 
vote
<Р> Мой решение с использованием C ++, 11 регулярное выражение (<код> [0-9]+([.][0-9]+)? 4 ), она может быть использована для более точной проверки, как <код> [0-9]+([.][0-9]+)? 5 , <код> [0-9]+([.][0-9]+)? 6 и т.д.
 <код> [0-9]+([.][0-9]+)? 7  
<Р> Вы можете найти этот код на http://ideone.com/lyDtfi , это может быть легко изменен для удовлетворения требований.
 

My solution using C++11 regex (#include <regex>), it can be used for more precise check, like unsigned int, double etc:

static const std::regex INT_TYPE("[+-]?[0-9]+"); static const std::regex UNSIGNED_INT_TYPE("[+]?[0-9]+"); static const std::regex DOUBLE_TYPE("[+-]?[0-9]+[.]?[0-9]+"); static const std::regex UNSIGNED_DOUBLE_TYPE("[+]?[0-9]+[.]?[0-9]+");  bool isIntegerType(const std::string& str_) {   return std::regex_match(str_, INT_TYPE); }  bool isUnsignedIntegerType(const std::string& str_) {   return std::regex_match(str_, UNSIGNED_INT_TYPE); }  bool isDoubleType(const std::string& str_) {   return std::regex_match(str_, DOUBLE_TYPE); }  bool isUnsignedDoubleType(const std::string& str_) {   return std::regex_match(str_, UNSIGNED_DOUBLE_TYPE); } 

You can find this code at http://ideone.com/lyDtfi, this can be easily modified to meet the requirements.

</div
 
 
 
 
3
 
vote
<Р> Как это было показано мне в ответ на мой связанный с этим вопрос, я чувствую, вы должны использовать повышение :: преобразование :: try_lexical_convert
 

As it was revealed to me in an answer to my related question, I feel you should use boost::conversion::try_lexical_convert

</div
 
 
3
 
vote
<Р> Мы можем использовать stringstream класса.
 <код> [0-9]+([.][0-9]+)? 8  
 

We may use a stringstream class.

    bool isNumeric(string str)     {        stringstream stream;                           double number;         stream<<str;        stream>>number;         return stream.eof();     } 
</div
 
 
3
 
vote
<Р> Использование <код> [0-9]+([.][0-9]+)? 9 . Этот код был проверен!
 <код> -?[0-9]+ 0  
 

Using <regex>. This code was tested!

bool isNumber(const std::string &token) {     return std::regex_match(token, std::regex("(\+|-)?[0-9]*(\.?([0-9]+))$")); } 
</div
 
 
2
 
vote

решение на основе Комментарий от Kbjorklu :

 <код> bool isNumber(const std::string& s) {    return !s.empty() && s.find_first_not_of("-.0123456789") == std::string::npos; }   

как с Ответ Дэвида ректора это не надежно на строки с несколькими точками или минусными знаками, но вы можете удалить символы просто проверить целые числа.


Тем не менее, я частичный для решения, основанный на Решение Ben Voigt , используя <код> strtod В CSTDLIB смотрите десятичные значения, научно-инженерные обозначения, гексидексимальные обозначения (C ++ 11) или даже инф / бесконечность / NAN (C ++ 11):

 <код> bool isNumberC(const std::string& s) {     char* p;     strtod(s.c_str(), &p);     return *p == 0; }   
 

A solution based on a comment by kbjorklu is:

bool isNumber(const std::string& s) {    return !s.empty() && s.find_first_not_of("-.0123456789") == std::string::npos; } 

As with David Rector's answer it is not robust to strings with multiple dots or minus signs, but you can remove those characters to just check for integers.


However, I am partial to a solution, based on Ben Voigt's solution, using strtod in cstdlib to look decimal values, scientific/engineering notation, hexidecimal notation (C++11), or even INF/INFINITY/NAN (C++11) is:

bool isNumberC(const std::string& s) {     char* p;     strtod(s.c_str(), &p);     return *p == 0; } 
</div
 
 
1
 
vote

После консультации по документации немного больше, я придумал ответ, который поддерживает мои потребности, но, вероятно, не будет так полезно для других. Вот оно (без раздражающего возвращения истинного и возврата ложных утверждений :-))

 <код> bool isNumber(string line)  {     return (atoi(line.c_str()));  }   
 

After consulting the documentation a bit more, I came up with an answer that supports my needs, but probably won't be as helpful for others. Here it is (without the annoying return true and return false statements :-) )

bool isNumber(string line)  {     return (atoi(line.c_str()));  } 
</div
 
 
   
   
1
 
vote

Я думаю, что это регулярное выражение должно обрабатывать почти все случаи

 <код> "^(\-|\+)?[0-9]*(\.[0-9]+)?"   

Так что вы можете попробовать следующую функцию, которая может работать с обоими (Unicode, так и ANSI)

 <код> bool IsNumber(CString Cs){ Cs.Trim();  #ifdef _UNICODE std::wstring sr = (LPCWSTR)Cs.GetBuffer(Cs.GetLength()); return std::regex_match(sr, std::wregex(_T("^(\-|\+)?[0-9]*(\.[0-9]+)?")));  #else     std::string s = (LPCSTR)Cs.GetBuffer(); return std::regex_match(s, std::regex("^(\-|\+)?[0-9]*(\.[0-9]+)?")); #endif }   
 

I think this regular expression should handle almost all cases

"^(\-|\+)?[0-9]*(\.[0-9]+)?" 

so you can try the following function that can work with both (Unicode and ANSI)

bool IsNumber(CString Cs){ Cs.Trim();  #ifdef _UNICODE std::wstring sr = (LPCWSTR)Cs.GetBuffer(Cs.GetLength()); return std::regex_match(sr, std::wregex(_T("^(\-|\+)?[0-9]*(\.[0-9]+)?")));  #else     std::string s = (LPCSTR)Cs.GetBuffer(); return std::regex_match(s, std::regex("^(\-|\+)?[0-9]*(\.[0-9]+)?")); #endif } 
</div
 
 
1
 
vote
 <код> include <string>   

для проверки двойников:

 <код> bool validateDouble(const std::string & input) { int decimals = std::count(input.begin(), input.end(), '.'); // The number of decimals in the string int negativeSigns = std::count(input.begin(), input.end(), '-'); // The number of negative signs in the string  if (input.size() == decimals + negativeSigns) // Consists of only decimals and negatives or is empty     return false; else if (1 < decimals || 1 < negativeSigns) // More than 1 decimal or negative sign     return false; else if (1 == negativeSigns && input[0] != '-') // The negative sign (if there is one) is not the first character     return false; else if (strspn(input.c_str(), "-.0123456789") != input.size()) // The string contains a character that isn't in "-.0123456789"     return false; return true;   

}

для проверки INT (с отрицаниями)

 <код> bool validateInt(const std::string & input) { int negativeSigns = std::count(input.begin(), input.end(), '-'); // The number of negative signs in the string  if (input.size() == negativeSigns) // Consists of only negatives or is empty     return false; else if (1 < negativeSigns) // More than 1 negative sign     return false; else if (1 == negativeSigns && input[0] != '-') // The negative sign (if there is one) is not the first character     return false; else if (strspn(input.c_str(), "-0123456789") != input.size()) // The string contains a character that isn't in "-0123456789"     return false; return true;   

}

для проверки unsigned ints

 <код> bool validateUnsignedInt(const std::string & input) { return (input.size() != 0 && strspn(input.c_str(), "0123456789") == input.size()); // The string is not empty and contains characters only in "0123456789"   

}

 
include <string> 

For Validating Doubles:

bool validateDouble(const std::string & input) { int decimals = std::count(input.begin(), input.end(), '.'); // The number of decimals in the string int negativeSigns = std::count(input.begin(), input.end(), '-'); // The number of negative signs in the string  if (input.size() == decimals + negativeSigns) // Consists of only decimals and negatives or is empty     return false; else if (1 < decimals || 1 < negativeSigns) // More than 1 decimal or negative sign     return false; else if (1 == negativeSigns && input[0] != '-') // The negative sign (if there is one) is not the first character     return false; else if (strspn(input.c_str(), "-.0123456789") != input.size()) // The string contains a character that isn't in "-.0123456789"     return false; return true; 

}

For Validating Ints (With Negatives)

bool validateInt(const std::string & input) { int negativeSigns = std::count(input.begin(), input.end(), '-'); // The number of negative signs in the string  if (input.size() == negativeSigns) // Consists of only negatives or is empty     return false; else if (1 < negativeSigns) // More than 1 negative sign     return false; else if (1 == negativeSigns && input[0] != '-') // The negative sign (if there is one) is not the first character     return false; else if (strspn(input.c_str(), "-0123456789") != input.size()) // The string contains a character that isn't in "-0123456789"     return false; return true; 

}

For Validating Unsigned Ints

bool validateUnsignedInt(const std::string & input) { return (input.size() != 0 && strspn(input.c_str(), "0123456789") == input.size()); // The string is not empty and contains characters only in "0123456789" 

}

</div
 
 
1
 
vote
 <код> bool isNumeric(string s){     if ( !s.empty() && s[0] != '-' )         s = "0" + s; //prepend 0      string garbage;      stringstream ss(s);      ss >> *(auto_ptr<double>(new double)) >> garbage; /* //the line above extracts the number into an anonymous variable. it could also be done like this: double x; ss >> x >> garbage; */     //if there is no garbage return true or else return false     return garbage.empty();  }   

Как это работает: StringStream & GT; & gt; Перегрузка может преобразовывать строки в различные арифметические типы Это делает это, чтение символов последовательно из строки (Ss в этом случае) до тех пор, пока он не запустится из символов или следующий символ, не соответствует критериям, которые должны храниться в тип переменной назначения.

Пример1:

 <код> stringstream ss("11"); double my_number; ss >> my_number; //my number = 11   

Пример2:

 <код> stringstream ss("011"); double my_number; ss >> my_number; //my number = 11   

Пример3:

 <код> stringstream ss("11ABCD"); double my_number; ss >> my_number; //my number = 11 (even though there are letters after the 11)   

«Мусорное» переменное объяснение «:

Почему бы не просто проверять, если извлечение в My Double имеет допустимое значение, а затем вернуть true, если он делает?

Обратите внимание, что пример3 выше, все еще успешно прочитал номер 11 в переменной my_number, даже если входная строка "11abcd" (которая не является числом).

Для обработки этого случая мы можем выполнить другое извлечение в строковую переменную (которая мне назвала мусор), которая может прочитать все, что, возможно, осталось в строковом буфере после начальной экстракции в переменную тип двойной. Если что-то осталось над ним будет читаться в «мусор», что означает, что полная строка, прошедшая, не было номером (она только начинается с одного). в этом случае, если бы мы хотели вернуть ложь;

Полученное сообщение «0»:

Попытка извлечения одного символа в двойной не удастся (возвращая 0 в нашу двойную), но все равно будет перемещать позицию строки буфера для после того, как символ. В этом случае наш сборщик мусора будет пустым, что приведет к неправильно возвращению функции функции. Чтобы обойти это, я предложил 0 на строку, чтобы, если, например, в том, что, если бы строка была включена, была «A», она изменяется на «0A», чтобы 0 будет извлечена в двойной, а «A» извлекается в мусор.

Добавить a 0 не повлияет на значение номера, чтобы число все равно будет правильно извлечено в нашу двойную переменную.

 
bool isNumeric(string s){     if ( !s.empty() && s[0] != '-' )         s = "0" + s; //prepend 0      string garbage;      stringstream ss(s);      ss >> *(auto_ptr<double>(new double)) >> garbage; /* //the line above extracts the number into an anonymous variable. it could also be done like this: double x; ss >> x >> garbage; */     //if there is no garbage return true or else return false     return garbage.empty();  } 

how it works: the stringstream >> overload can convert strings to various arithmetic types it does this by reading characters sequentially from the stringstream (ss in this case) until it runs out of characters OR the next character does not meet the criteria to be stored into the destination variable type.

example1:

stringstream ss("11"); double my_number; ss >> my_number; //my number = 11 

example2:

stringstream ss("011"); double my_number; ss >> my_number; //my number = 11 

example3:

stringstream ss("11ABCD"); double my_number; ss >> my_number; //my number = 11 (even though there are letters after the 11) 

the "garbage" variable explanation":

why not just check if extraction into my double has a valid value and then return true if it does?

notice example3 above will still successfully read the number 11 into the my_number variable even if the input string is "11ABCD" (which is not a number).

to handle this case we can do another extraction into a string variable(which I named garbage) which can read anything that may have been left over in the string buffer after the initial extraction into the variable of type double. If anything is left over it will be read into "garbage" which means the full string passed in was not a number (it just begins with one). in this which case we'd want to return false;

the prepended "0" explanation":

attempting to extract a single character into a double will fail(returning 0 into our double) but will still move the string buffer position to after the character. In this case our garbage read will be empty which would cause the function to incorrectly return true. to get around this I prepended a 0 to the string so that if for example the string passed in was "a" it gets changed to "0a" so that the 0 will be extracted into the double and "a" gets extracted into garbage.

prepending a 0 will not affect the value of the number so the number will still be correctly extracted into our double variable.

</div
 
 
 
 
1
 
vote

Чтобы проверить, является ли строка числа целочисленной или плавающей точкой или поэтому вы можете использовать:

 <код>  #include <sstream>      bool isNumber(string str) {     double d;     istringstream is(str);     is >> d;     return !is.fail() && is.eof(); }   
 

to check if a string is a number integer or floating point or so you could use :

 #include <sstream>      bool isNumber(string str) {     double d;     istringstream is(str);     is >> d;     return !is.fail() && is.eof(); } 
</div
 
 
 
 
1
 
vote

еще один ответ, который использует <код> stold (хотя вы также можете использовать <код> stof / <код> stod Если вам не требуется точность).

 <код> bool isNumeric(const std::string& string) {     std::size_t pos;     long double value = 0.0;      try     {         value = std::stold(string, &pos);     }     catch(std::invalid_argument&)     {         return false;     }     catch(std::out_of_range&)     {         return false;     }      return pos == string.size() && !std::isnan(value); }   
 

Yet another answer, that uses stold (though you could also use stof/stod if you don't require the precision).

bool isNumeric(const std::string& string) {     std::size_t pos;     long double value = 0.0;      try     {         value = std::stold(string, &pos);     }     catch(std::invalid_argument&)     {         return false;     }     catch(std::out_of_range&)     {         return false;     }      return pos == string.size() && !std::isnan(value); } 
</div
 
 
1
 
vote

Попробуйте:

 <код> bool checkDigit(string str) {      int n=str.length();     for(int i=0;    i   < n ;   i++)    {      if(str[i]<'0' || str[i]>'9')        return false;    }     return true; }   
 

Try this:

bool checkDigit(string str) {      int n=str.length();     for(int i=0;    i   < n ;   i++)    {      if(str[i]<'0' || str[i]>'9')        return false;    }     return true; } 
</div
 
 
0
 
vote

Несколько месяцев назад я реализовал способ определить, является ли какая-либо строка целочисленной, шестнадцатеричной или двойной.

 <код> stringstream ss("11"); double my_number; ss >> my_number; //my number = 11 0  

Тогда в вашей программе вы можете легко преобразовать номер в функции его тип, если вы выполните следующие,

 <код> stringstream ss("11"); double my_number; ss >> my_number; //my number = 11 1  

Вы можете понять, что функция вернет 0, если число не было обнаружено. 0 его можно рассматривать как false (как логический).

 

Few months ago, I implemented a way to determine if any string is integer, hexadecimal or double.

enum{         STRING_IS_INVALID_NUMBER=0,         STRING_IS_HEXA,         STRING_IS_INT,         STRING_IS_DOUBLE };  bool isDigit(char c){     return (('0' <= c) && (c<='9')); }  bool isHexaDigit(char c){     return ((('0' <= c) && (c<='9')) || ((tolower(c)<='a')&&(tolower(c)<='f'))); }   char *ADVANCE_DIGITS(char *aux_p){      while(CString::isDigit(*aux_p)) aux_p++;     return aux_p; }  char *ADVANCE_HEXADIGITS(char *aux_p){      while(CString::isHexaDigit(*aux_p)) aux_p++;     return aux_p; }   int isNumber(const string & test_str_number){     bool isHexa=false;     char *str = (char *)test_str_number.c_str();      switch(*str){     case '-': str++; // is negative number ...                break;     case '0':                if(tolower(*str+1)=='x')  {                   isHexa = true;                   str+=2;               }               break;     default:             break;     };      char *start_str = str; // saves start position...     if(isHexa) { // candidate to hexa ...         str = ADVANCE_HEXADIGITS(str);         if(str == start_str)             return STRING_IS_INVALID_NUMBER;          if(*str == ' ' || *str == 0)              return STRING_IS_HEXA;      }else{ // test if integer or float         str = ADVANCE_DIGITS(str);         if(*str=='.') { // is candidate to double             str++;             str = ADVANCE_DIGITS(str);             if(*str == ' ' || *str == 0)                 return STRING_IS_DOUBLE;              return STRING_IS_INVALID_NUMBER;         }          if(*str == ' ' || *str == 0)             return STRING_IS_INT;      }      return STRING_IS_INVALID_NUMBER;   } 

Then in your program you can easily convert the number in function its type if you do the following,

string val; // the string to check if number...  switch(isNumber(val)){    case STRING_IS_HEXA:     // use strtol(val.c_str(), NULL, 16); to convert it into conventional hexadecimal    break;    case STRING_IS_INT:     // use (int)strtol(val.c_str(), NULL, 10); to convert it into conventional integer    break;    case STRING_IS_DOUBLE:    // use atof(val.c_str()); to convert it into conventional float/double    break; } 

You can realise that the function will return a 0 if the number wasn't detected. The 0 it can be treated as false (like boolean).

</div
 
 
0
 
vote

Я предлагаю простую конвенцию:

Если преобразование в ASCII IS & GT; 0 или начинается с 0, то это число. Это не идеально, но быстро.

что-то вроде этого:

 <код> stringstream ss("11"); double my_number; ss >> my_number; //my number = 11 2  
 

I propose a simple convention:

If conversion to ASCII is > 0 or it starts with 0 then it is a number. It is not perfect but fast.

Something like this:

string token0;  if (atoi(token0.c_str())>0 || isdigit(token0.c_str()[0]) ) { //this is a value     // do what you need to do... } 
</div
 
 
0
 
vote

Эта функция заботится обо всех возможных случаях:

 <код> stringstream ss("11"); double my_number; ss >> my_number; //my number = 11 3  
 

This function takes care of all the possible cases:

bool AppUtilities::checkStringIsNumber(std::string s){     //Eliminate obvious irritants that could spoil the party     //Handle special cases here, e.g. return true for "+", "-", "" if they are acceptable as numbers to you     if (s == "" || s == "." || s == "+" || s == "-" || s == "+." || s == "-.") return false;      //Remove leading / trailing spaces **IF** they are acceptable to you     while (s.size() > 0 && s[0] == ' ') s = s.substr(1, s.size() - 1);     while (s.size() > 0 && s[s.size() - 1] == ' ') s = s.substr(0, s.size() - 1);       //Remove any leading + or - sign     if (s[0] == '+' || s[0] == '-')         s = s.substr(1, s.size() - 1);      //Remove decimal points     long prevLength = s.size();      size_t start_pos = 0;     while((start_pos = s.find(".", start_pos)) != std::string::npos)          s.replace(start_pos, 1, "");      //If the string had more than 2 decimal points, return false.     if (prevLength > s.size() + 1) return false;      //Check that you are left with numbers only!!     //Courtesy selected answer by Charles Salvia above     std::string::const_iterator it = s.begin();     while (it != s.end() && std::isdigit(*it)) ++it;     return !s.empty() && it == s.end();      //Tada.... } 
</div
 
 
0
 
vote

Не могли бы вы просто использовать код возврата SSCANF, чтобы определить, является ли это int?

 <код> bool is_number(const std::string& s) {     int value;     int result = sscanf(valueStr.c_str(), "%d", &value);     return (result != EOF && readResult != 0); }   
 

Could you simply use sscanf's return code to determine if it's an int?

bool is_number(const std::string& s) {     int value;     int result = sscanf(valueStr.c_str(), "%d", &value);     return (result != EOF && readResult != 0); } 
</div
 
 
0
 
vote

Стиль C / C ++ для целых чисел без знака, используя диапазон <код> for C ++ 11:

 <код> int isdigits(const std::string & s) {     for (char c : s) if (!isdigit(c)) return (0);     return (1); }   
 

C/C++ style for unsigned integers, using range based for C++11:

int isdigits(const std::string & s) {     for (char c : s) if (!isdigit(c)) return (0);     return (1); } 
</div
 
 

Связанный проблема

-1  C ++ DO В то время как проблемы с петлей [закрыто]  ( C do while loop issues ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

4  Строка :: Новая: что это?  ( Stringnew what is it ) 
Я из фона Java и изучает C ++. Я столкнулся с следующим C ++: <код> String source = String::New("'Hello' + ', World'"); Как то, что я так понимаю, это ...

0  Как захватывать события, выпущенные из нового окна всплывающего  ( How to capture events fired from new popup ie window ) 
Приветствия! <Сильная> Ситуация: My ActiveX DLL содержит индивидуальный webbrowser. WebBrowser отображает веб-страницу. Когда пользователь нажимает на сс...

1  Проблема с использованием TextureView с NDK  ( Issue using textureview with ndk ) 
Я работаю над небольшим кусочком кода, используя текстуру, чтобы отобразить результат среды MediaPlayer. Я сталкиваюсь с проблемой, пытающимся смешивать упр...

3  Отправка HTTP Post Запрос на обновление содержимого файла с использованием C ++ REST SDK Casablanca  ( Sending a http post request for updating file contents using c rest sdk casabl ) 
Я пытаюсь обновить содержимое файла на сервере Alfresco, используя C ++ SDK SDK. Я использую URL Alfresco CMIS URL для отправки запроса. Быть более конкретным...

-4  Петля, которая компилирует и работает в INT основной функции не скомпилируется при введении в отдельную функцию [закрыто]  ( Loop that compiles and runs in int main function wont compile when put into a se ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыто. Этот вопрос нуждается в Детали отладки . В настоящее вр...

-1  Приложение C ++ в массивах с использованием арифметического указателя  ( C app on arrays using pointer arithmetic ) 
Вопрос: как я могу генерировать случайное животное из массива, используя эту функцию? <код> const int MAX =12; //12 animals const int MAXSTR = 10; ...

29  Добавление! Оператор и SQRT (), POW () и т. Д. Для пример примерка калькулятора  ( Adding the operator and sqrt pow etc to a calculator example applicatio ) 
Я делаю упражнения в новой книге Strustrup "Принципы программирования и практики с использованием C ++" и было интересно, если кто-нибудь на переполнении ст...

1  Как работают Char и INT в C ++  ( How do char and int work in c ) 
Может быть, я собираюсь задать глупый вопрос, но я хочу подтвердить, как работает Char? Позвольте мне объяснить с примерами того, что я хочу спросить. Пусть п...

1  Наличие проблемных проектов C ++ в Eclipse CDT в ОС X для глупой причины  ( Having trouble building c project in eclipse cdt in os x for a silly reason ) 
Я пытаюсь построить очень простую программу C ++ в Eclipse, и я получаю очень глупую ошибку: <код> **** Internal Builder is used for build **...

6  Singleton & Multi-Threading  ( Singleton multi threading ) 
У меня есть следующий класс <код> class Singleton { private: static Singleton *p_inst; Singleton(); public: static Singleton * instance()...

14  Классы, Rvalues ​​и Rvalue Список  ( Classes rvalues and rvalue references ) 
Lvalue - это значение, связанное с окончательной областью памяти, тогда как rvalue - это значение выражения, существование которого является временным, а не о...

3  Как создавать закрытые зоны (выпуклые многоугольники) от набора сегментов линии?  ( How to create closed areas convex polygons from set of line segments ) 
Следующая проблема находится в 2D, поэтому некоторые упрощения могут быть сделаны при предложении ответов. Мне нужно создать закрытые области (определены ли...

3  Преобразование IPlimage в вектор в 1D в OpenCV  ( Converting iplimage into 1d vector in opencv ) 
Я хочу преобразовать MXN IPLIMAGE в вектору A (M * N) x 1 1. Может ли это сделать с любой функцией в OpenCV? Любая помощь значительно ценится. ...

29  C ++ Указатель на объекты  ( C pointer to objects ) 
в C ++ У вас всегда инициализировать указатель на объект с new ключевое слово? или вы просто имеете это тоже: <код> MyClass *myclass; myclass->DoSometh...

Связанный проблема

-1  C ++ DO В то время как проблемы с петлей [закрыто] 
4  Строка :: Новая: что это? 
0  Как захватывать события, выпущенные из нового окна всплывающего 
1  Проблема с использованием TextureView с NDK 
3  Отправка HTTP Post Запрос на обновление содержимого файла с использованием C ++ REST SDK Casablanca 
-4  Петля, которая компилирует и работает в INT основной функции не скомпилируется при введении в отдельную функцию [закрыто] 
-1  Приложение C ++ в массивах с использованием арифметического указателя 
29  Добавление! Оператор и SQRT (), POW () и т. Д. Для пример примерка калькулятора 
1  Как работают Char и INT в C ++ 
1  Наличие проблемных проектов C ++ в Eclipse CDT в ОС X для глупой причины 
6  Singleton & Multi-Threading 
14  Классы, Rvalues ​​и Rvalue Список 
3  Как создавать закрытые зоны (выпуклые многоугольники) от набора сегментов линии? 
3  Преобразование IPlimage в вектор в 1D в OpenCV 
29  C ++ Указатель на объекты 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.