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 >> overload може конвертувати рядки в різні арифметичні типи, це робить це, читаючи символи послідовно з stringstream (ss у цьому випадку), поки не закінчиться символів АБО наступний символ не відповідає критеріям, які потрібно зберігати у тип змінної призначення.
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)
пояснення змінної "сміття":
чому б не просто перевірити, чи має видобуток у моєму подвійному дійсне значення, а потім повернути true, якщо він є
Приклад повідомлення3 вище, як і раніше, буде успішно прочитати число 11 у змінній my_number, навіть якщо вхідний рядок є "11ABCD" (що не є числом).
для вирішення цього випадку ми можемо зробити ще одне вилучення в рядкову змінну (яку я назвав сміттям), яка може прочитати все, що, можливо, залишилося в буфері рядків після початкового вилучення в змінну типу double. Якщо щось залишилося, воно буде прочитане у "сміття", що означає, що повний рядок, переданий не був номером (він починається з одиниці). у такому випадку ми хочемо повернути помилкові;
попередньо "0" пояснення ":
спроба вилучення одного символу в подвійний буде невдалою (повернення 0 у наш подвійний), але все-таки буде переміщено позицію буфера рядка до символу. У такому випадку наше сміття, яке буде прочитано, буде порожнім, що призведе до того, що функція неправильно поверне true. щоб обійти це, я заздалегідь передбачив 0 до рядка, так що якщо, наприклад, передана рядок була "a", вона змінюється на "0a", так що 0 буде вилучено в подвійне, а "a" потрапить у сміття.
Попереднє значення 0 не вплине на значення числа, тому число все одно буде правильно виведено в нашу подвійну змінну.
if (expr) return true; return false;
! Просто напишітьreturn expr;
.