C++ 我如何知道我的C++;字符串变量是否为数字
我有一个字符串的类字符串C++ 我如何知道我的C++;字符串变量是否为数字,c++,string,parsing,C++,String,Parsing,我有一个字符串的类字符串 string str; 我如何检查它是否是一个数字,str只能有下面描述的3种可能的类型,如 abcd 或者类似的数字 123.4 或在其结尾附加括号的数字,例如 456) 注意,“str”结尾的括号是数字和无数字的唯一可能组合 如果最后两个被认为是有效数字,我知道如果只有前两个情况发生,我可以使用词汇转换,但是考虑所有3个可能发生的情况如何? 我不需要对str做任何花哨的事情,我只需要知道它是否是我描述的有效数字你必须定义“数字”。没有通用的“数字”类型(例如
string str;
我如何检查它是否是一个数字,str只能有下面描述的3种可能的类型,如
abcd
或者类似的数字
123.4
或在其结尾附加括号的数字,例如
456)
注意,“str”结尾的括号是数字和无数字的唯一可能组合
如果最后两个被认为是有效数字,我知道如果只有前两个情况发生,我可以使用词汇转换,但是考虑所有3个可能发生的情况如何?
我不需要对str做任何花哨的事情,我只需要知道它是否是我描述的有效数字你必须定义“数字”。没有通用的“数字”类型(例如,第一个数字是双精度的,而第二个是整数)
也就是说,如中所示,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;
}
模板
R词法转换(常量T和pX)
{
std::stringstream-ss;
ss>result).fail()| |!(ss>>std::ws.eof())
{
抛出std::bad_cast();
}
返回结果;
}
因此,只需创建一个新函数:
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;
}
模板
R弱词法转换(常量T和pX)
{
std::stringstream-ss;
ss>结果)。失败()
{
抛出std::bad_cast();
}
返回结果;
}
基本上是一个代码> ListalyOxCase<代码>,但不关心任何剩余字符(允许您的第二个数字工作)。< /P> < P>也许正则表达式会为您提供技巧。
< P>解析字符串的C++解决方案是字符串流。将字符串放入std::istringstream
并从中读取
要解析它,您可以尝试从字符串中读取(无符号
)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?!";
}
// ...
}
这有意义吗 重复:哇。在SO的一个半月里,我不能说我见过在原稿发布3小时后发布的副本。@Maulrus但你见过大象飞吗?尽管投了反对票,这也不是个坏主意。你能举个例子吗?