验证字符串是不是只有数字并且只有一定的长度

Posted

技术标签:

【中文标题】验证字符串是不是只有数字并且只有一定的长度【英文标题】:Validate a string is only digits and only a certain length验证字符串是否只有数字并且只有一定的长度 【发布时间】:2018-11-08 21:42:32 【问题描述】:

所以我有一个问题。

我需要获取一个字符串(我不能将它作为一个 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 之间转换。

【问题讨论】:

9 位或 13 位数字”和“9-13 位数字长度”是相互矛盾的要求。你真正需要哪一个?正好是 9 位或 13 位,还是介于 9 位和 13 位之间? 我从字面上引用了那里的作业。所以我将假设 9 位或 13 位。但是,正如我所说,长度不是我需要的,我需要能够验证它们只是数字,非字母。 为什么要从 ISBN-10 中拆分校验和,而不是从 ISBN-13 中拆分? 你在说什么? ISBN 可以是旧式 ISBN-10(校验和在最后,0 到 9 或 X),也可以是新式 ISBN-13(校验和在最后,0 到 9)。前者可以映射到后者。 See wikipedia on ISBN. 【参考方案1】:

在您的Book 构造函数中,确保它正在调用setISBN() 而不是直接设置this-&gt;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';
    

【讨论】:

当我运行它时,它仍然没有将所需的项目转换为 0,它仍然显示“thisisshith” 确保您的构造函数使用 setISBN 方法设置 ISBN,或者在构造函数中对 ISBN 进行类似检查。【参考方案2】:

想通了!

代码中还有一部分是:

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';

这修复了我需要修复的问题。谢谢!

【讨论】:

更好的解决方案是让构造函数调用setISBN(),这样您的验证都在一个地方:Book::Book(string ISBN, ...) this-&gt;setISBN(ISBN); ...

以上是关于验证字符串是不是只有数字并且只有一定的长度的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环中拆分和验证字符串是不是存在

使用 jQuery Validation 插件验证前 4 个字符

C# 验证给定的字符串是否为数字

在 JavaScript 中提交时值的长度验证错误 [关闭]

只有字符 - 不是特殊的/来自键盘的数字 - iPhone

SAS:将字符变量转换为数字,如果输入的某些字段只有0,则保持全0