Перед преобразованием wstring
в double
- как проверить его с помощью регулярного выражения? Java не проблема, но C++ поднимает вопросы.. :)
Я полагаю, у вас есть string
и вы хотите знать, если она double
или нет. Следующий код не использует регулярные выражения. Вместо этого он инициализирует stringstream
и читает двойной из него. Если строка начинается с чего-то нечислового, то будет установлен ss.fail()
. Если он начинается с числа, но не читает целую строку, то в конце строки есть что-то нечисловое. Так что если все ss.eof() && !ss.fail()
хорошо, а строка - это всего лишь число, то ss.eof() && !ss.fail()
будет true
.
#include <iostream>
#include <sstream>
int main()
{
std::stringstream ss("123.456");
double mydouble;
ss >> mydouble;
if (ss.eof() && !ss.fail())
std::cout << "yay, success: " << mydouble << std::endl;
else
std::cout << "that was not a double." << std::endl;
return 0;
}
Там также std::wstringstream
если вам нужно преобразовать строки с широким символом.
Вы также можете захотеть взглянуть на библиотеки boost, особенно на Boost.Lexical_Cast. С помощью этой библиотеки вы можете сделать следующее:
#include <boost/lexical_cast.hpp>
#include <iostream>
int main()
{
try
{
double mydouble = boost::lexical_cast<double>("123.456");
std::cout << "yay, success: " << mydouble << std::endl;
}
catch(const boost::bad_lexical_cast &)
{
std::cout << "that was not a double." << std::endl;
}
return 0;
}
wstring
- как это сделать правильно?
std::wstringstream
если вам нужно работать со строками широких символов.
Или, может быть, проще сделать так:
std::wstring strKeyValue = "147.sd44";
double value = (double) _wtof(strKeyValue.c_str());
И если strKeyValue==0
то это означает, что он не двойной.
value=0
, то это не double
. Но что, если strKeyValue="0.00"
?
stringstream
.
"someString".matches(some regex)
, но как это сделать в C ++?