Есть ли предопределенная функция, которая может определить, содержит ли строка только число? - PullRequest
1 голос
/ 04 июля 2010

Довольно простой вопрос ... Есть ли в Qt предопределенная функция, которая может определить, содержит ли строка только число? .. с действительными записями, такими как «28» и недействительными записями, такими как «28», «28» и «2a8 ....?

Ответы [ 4 ]

5 голосов
/ 04 июля 2010

Посмотрите на QValidator и его подклассы, если вы пытаетесь проверить ввод от пользователя.

Если вы пытаетесь преобразовать входные данные в строке в число, взгляните на методы, такие как toInt из класса QString.

1 голос
/ 04 июля 2010

Ну, я предполагаю, что число вы имеете в виду целое число. Вы можете пойти по этому пути.

int QString::toInt ( bool * ok = 0, int base  = 10 ) const

Из документации

Если возникает ошибка преобразования, * ok устанавливается в значение false; в противном случае * ok имеет значение true.

Итак, после вызова функции проверьте значение ok. Если это true (то есть, если строка может быть преобразована в число), , тогда ваша строка содержит только цифры .

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

double QString::toDouble ( bool * ok = 0 ) const

Больше документации и примеров можно увидеть здесь

Надеюсь, это поможет ..

1 голос
/ 04 июля 2010

Простейшим, вероятно, является проверка того, содержит ли строка какие-либо пробелы - если это не удается. Затем используйте strtod и / или strtol , чтобы проверить правильность номера.

#include <string>
#include <cstdlib>
#include <cassert>

bool HasSpaces( const std::string & s ) {
    return s.find( ' ' ) != std::string::npos;
}

bool IsInt( const std::string & s ) {
    if ( HasSpaces( s ) ) {
        return false;
    }
    char * p;
    strtol( s.c_str(), & p, 10 );   // base 10 numbers 
    return * p == 0;
}


bool IsReal( const std::string & s ) {
    if ( HasSpaces( s ) ) {
        return false;
    }
    char * p;
    strtod( s.c_str(), & p );  
    return * p == 0;
}

int main() {
    assert( IsReal( "1.23" ) );
    assert( IsInt( "1" ) );
    assert( IsInt( "-1" ) );
    assert( IsReal( "-1" ) );
    assert( ! IsInt( "1a" ) );
    assert( ! IsInt( " 1" ) );
}

Обратите внимание на приведенный выше код; y работает для чисел в числовом диапазоне реализации C ++ - например, он не будет работать правильно для произвольно больших целых чисел.

0 голосов
/ 04 июля 2010

хорошо, я согласен, что самый простой способ - это преобразовать в число с помощью toInt () и связанных функций и проверить логический параметр, но вы также можете сделать что-то вроде использования qstring :: at () и вызова isdigit для возвращаемого значения, например this (зацикливание на строке)

myString.at(i).isDigit() это вернет true, если символ в позиции i является числом, поэтому вы можете создать простую функцию, которая принимает строку и возвращает true, если все символы являются цифрами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...