2013-03-19 2 views
1

У меня есть строка с множеством разных символов, похожих на: "$:" "213.23453" Как извлечь двойное значение 213.23453 и сохранить его в переменной, это C++/C и я не могу использовать лямбды.Извлечение двойника из строки с текстом

+0

попробовать Regex в CPP – Prasad

+0

[ 'stod'] (http://en.cppreference.com/w/cpp/string/basic_string/stof) –

+0

Вы первый нужно решить, пишете ли вы C или C++, потому что ответ различен для двух языков. –

ответ

1

Вы можете использовать «регулярные выражения бедняка» функций sscanf пропустить символы до первой цифры, а затем чтение двойного, как это:

char *str = "\"$: \" \"213.23453\""; 
double d; 
sscanf(str, "%*[^0-9]%lf", &d); 

Примечания звездочки после первой процентного format: он инструктирует sscanf читать строку без записи ее содержимого в выходной буфер.

Адрес demo on ideone.

раствора
0

Используйте регулярное выражение.

[$]?[0-9]*(\.)?[0-9]?[0-9]?

Это должно совпадать с знаком $ и без нее.

Boost.Regex очень хорошее регулярное выражение библиотека

Лично я считаю Boost.Xpressive гораздо приятнее работать. Это библиотека только для заголовка, и у нее есть некоторые интересные функции, такие как статические регулярные выражения (регулярные выражения, скомпилированные во время компиляции).

Если вы используете компилятор, совместимый с C++ 11, используйте std::regex, если у вас нет оснований использовать что-то еще.

+1

Обратите внимание, что хотя 'std :: regex' с GCC 4.7 компилируется просто отлично, на самом деле он очень дисфункциональный. –

0

Чистых С ++ может быть вручную отрезать символы мусора перед номером (первую цифру, идентифицированный std::isdigit), а затем просто построить временный istringstream объект для извлечения double из:

std::string myStr("$:. :$$#&*$ :213.23453$:#$;"); 

// find the first digit: 
int startPos = 0; 
for (; startPos < myStr.size(); ++startPos) 
    if (std::isdigit(myStr[startPos])) break; 

// cut off the trash: 
myStr = myStr.substr(startPos, myStr.size() - startPos); 

// retrieve the value: 
double d; 
std::istringstream(myStr) >> d; 

но C- стиль sscanf с соответствующим форматом, указанным будет достаточно и здесь :)