Проверяйте строку только цифрами и только определенной длины - PullRequest
0 голосов
/ 09 ноября 2018

Итак, у меня есть проблема.

Мне нужно взять строку (у меня не может быть ее как int, она должна быть определена как строка), и внутри метода set я должен проверить, что число имеет длину 9 или 13 цифр и содержит только цифры.

Я могу проверить длину, используя str.length (), но не могу подтвердить, что вход содержит только цифры.

Вот мой текущий код:

void Book::setISBN(string ISBN) 
{

//validate the length here  ALSO NEED TO VALIDATE ITS A NUMBER

if (ISBN.length() >= 9 && ISBN.length() <= 13) {

    this->ISBN = ISBN;
}
else {
    this->ISBN = '0';
}
}

Это код, который будет извлекать информацию:

Book b = Book();
b.setISBN("23");
b.setAuthor("R.L. Stine");
b.setTitle("Goosebumps");
b.setPrice(25.00);

Book b2 = Book("thisisshith", "Stephen King", "IT", 20.32);

Первая часть b работает как setISBN ("23") вернется с нуля, но b2 "thisisshith" вернется точно так же. Мне нужно, чтобы оно также возвращалось как 0. Если бы это был набор цифр длиной от 9 до 13, он бы возвращал правильно.

Любая помощь будет оценена.

Я попытался isdigit (), но говорит, что он не может преобразовать между строкой и int.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Разобрался!

В коде также есть часть:

Book::Book(string ISBN, string author, string title, double price) {
this->ISBN = ISBN;
this->author = author;
this->title = title;
this->price = price;`

Я добавил это в конец этой строки:

    if ((ISBN.length() == 9) || (ISBN.length() == 13) &&
    ISBN.find_first_not_of("0123456789") == string::npos)
{
    this->ISBN = ISBN;
}
else {
    this->ISBN = '0';
}

Это исправляет то, что мне нужно исправить. Спасибо!

0 голосов
/ 09 ноября 2018

В конструкторе Book убедитесь, что он вызывает setISBN(), а не устанавливает this->ISBN напрямую:

Book::Book(string ISBN, ...) {
    //this->ISBN = ISBN;
    this->setISBN(ISBN);
    ...
}

Затем внутри setISBN() вы можете сделать что-то вроде этого:

void Book::setISBN(string ISBN) 
{
    if (((ISBN.length() == 9) || (ISBN.length() == 13)) &&
        (ISBN.find_first_not_of("0123456789") == string::npos))
    {
        this->ISBN = ISBN;
    }
    else
    {
        this->ISBN = '0';
    }
}

Если вы хотите использовать isdigit() вместо этого, вам понадобится цикл, который проверяет каждого отдельного char в строке. Вы можете сделать это вручную:

#include <cctype>

void Book::setISBN(string ISBN) 
{
    if ((ISBN.length() == 9) || (ISBN.length() == 13))
    {
        for (int i = 0; i < ISBN.length(); ++i)
        {
            if (!isdigit(static_cast<unsigned char>(ISBN[i])))
            {
                this->ISBN = '0';
                return;
            }
        }
        this->ISBN = ISBN;
    }
    else
    {
        this->ISBN = '0';
    }
}

Или вы можете использовать стандартные алгоритмы поиска, например std::find() или std::all_of():

#include <algorithm>
#include <cctype>

void Book::setISBN(string ISBN) 
{
    if (((ISBN.length() == 9) || (ISBN.length() == 13)) &&
        (std::find(ISBN.begin(), ISBN.end(), [](char ch){ return !isdigit(static_cast<unsigned char>(ch)); }) == ISBN.end()))
    {
        this->ISBN = ISBN;
    }
    else
    {
        this->ISBN = '0';
    }
}

#include <algorithm>
#include <cctype>

void Book::setISBN(string ISBN) 
{
    if (((ISBN.length() == 9) || (ISBN.length() == 13)) &&
        std::all_of(ISBN.begin(), ISBN.end(), [](char ch)->bool { return isdigit(static_cast<unsigned char>(ch)); }))
    {
        this->ISBN = ISBN;
    }
    else
    {
        this->ISBN = '0';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...