我有一个类字符串
的字符串string str;
如何检查它是否为数字,str只能有下面描述的3种可能的类型,如
abcd
或类似
的数字123.4
或带有括号的数字附加到结尾,例如
456)
请注意,“str”末尾的括号是数字和无数字的唯一可能组合
其中底部两个被认为是有效数字,我知道如果只出现前两种情况我可以使用lexical_cast,但如何考虑所有3种可能的情况呢? 我不需要用str做任何事情,我只需要知道它是否是我描述的有效数字
答案 0 :(得分:0)
您必须定义“数字”。没有通用的“数字”类型(例如,您的第一个数字是双精度数,而第二个数字是整数)。
也就是说,如this answer所示,lexical_cast
只检查目标且仅目的地是否存在:
template <typename R, typename T>
R lexical_cast(const T& pX)
{
std::stringstream ss;
ss << pX;
R result; // take out any whitespace, make sure nothing is left
if ((ss >> result).fail() || !(ss >> std::ws).eof())
{
throw std::bad_cast();
}
return result;
}
所以只需创建一个新功能:
template <typename R, typename T>
R weak_lexical_cast(const T& pX)
{
std::stringstream ss;
ss << pX;
R result;
if ((ss >> result).fail())
{
throw std::bad_cast();
}
return result;
}
它基本上是lexical_cast
但不关心任何剩余的字符(允许你的第二个数字起作用。)
答案 1 :(得分:0)
也许一个正则表达式可以帮到你。
答案 2 :(得分:0)
用于手动解析字符串的C ++解决方案是字符串流。将您的字符串放入std::istringstream
并从中读取。
您可以做的解析是尝试从字符串中读取(unsigned
)int
。
如果失败,则为不以数字开头的字符串
如果它有效,请查看下一个字符。如果那是.
你有一个浮点数,如果它是)
,你就有一个整数。 (否则您有读数错误。)
的内容
void read(const std::string& str)
{
std::istringstream iss(str);
int i;
if( !(iss>>i) ) {
// str contains "abcd"
} else {
switch( iss.peek() ) {
case ')':
// i contains '456'
break;
case '.' {
double d;
if( !(iss>>d) ) throw "dammit!";
d += i;
// d contains floating point value
break;
default: throw "what?!";
}
// ...
}
这有意义吗?