2013-03-19 86 views
1

我有一個字符串,其中包含許多不同的字符,類似於:「$:」「213.23453」 如何提取double值213.23453並將其存儲在變量中,它是C++/C我不能使用lambdas。從文本字符串中提取雙精度值

+0

嘗試正則表達式在cpp – Prasad 2013-03-19 11:41:50

+0

['stod'](http://en.cppreference.com/w/cpp/string/basic_string/stof) – 2013-03-19 11:49:01

+0

您首先必須決定是否編寫C或C++,因爲這兩種語言的答案是不同的。 – 2013-03-19 12:06:16

回答

1

可以使用sscanf功能的「窮人的正則表達式」跳過字符之前的第一個數字,然後讀雙,這樣的:

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

注意第一百分比後面的星號格式:它指示sscanf讀取字符串而不將其內容寫入輸出緩衝區。

這是demo on ideone

0

使用正則表達式。

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

這應該與那些有$符號和那些沒有。

Boost.Regex是一個很好的正則表達式庫

就個人而言,我覺得Boost.Xpressive好得多的工作。它是一個只有頭文件的庫,它有一些很好的功能,例如靜態正則表達式(在編譯時編譯的正則表達式)。

如果您使用的是C++ 11兼容編譯器,請使用std::regex,除非您有充分理由使用其他內容。

+1

但是,請注意,雖然使用GCC 4.7編譯的'std :: regex'很好,但它實際上非常不正常。 – 2013-03-19 11:49:22

0

純C++解決方案可以是手動切斷的數目(由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與指定適當的格式將在這裏以及:)