2014-10-10 27 views
1

由於經常從.csv或.txt文件讀取這樣的字符串,我想知道獲取%d/%m%/%y(或任何其他類似格式)字符串並將其轉換爲適合於QuantLib::Date對象constructor的內容。將日期std :: string轉換爲QuantLib :: Date對象

這裏的下方示例代碼:

#include <ql/quantlib.hpp> 
#include <boost/timer.hpp> 
#include <iostream> 
#include <iomanip> 
#include <boost/algorithm/string.hpp> 

int main() { 

    boost::timer timer; 
    std::cout << std::endl; 
    std::string datesString = { 
    ",17/10/2014,21/11/2014,19/12/2014,20/03/2015,19/06/2015,18/09/2015,18/12/2015,17/06/2016," 
    }; 
    std::vector<std::string> expiryDates; 
    boost::split(expiryDates, datesString, boost::is_any_of(",")); 
    for(int i = 0; i < expiryDates.size(); i++) 
    { 
    std::cout << expiryDates[i] << std::endl; 
    } 
    // 17/10/2014 
    // 21/11/2014 
    // 19/12/2014 
    // 20/03/2015 
    // 19/06/2015 
    // 18/09/2015 
    // 18/12/2015 
    // 17/06/2016 

    // QuantLib::Date myQLDate(?); 

    return 0; 

    } 

回答

5

這是一種隱藏的,但一旦你有<ql/utilities/dataparsers.hpp>你可以使用:

Date d = DateParser::parseFormatted(expiryDates[i], format); 

其中format是Boost.Date格式字符串。在你的情況下,

Date d = DateParser::parseFormatted(expiryDates[i], "%d/%m/%Y"); 

應該做的伎倆。

+2

*是*隱藏。 +1,適用於QuantLib文檔。 – 2014-10-11 00:52:35

+0

是的。直到一兩年前,這個功能還是非常有限的(它只能解析一些特定的格式,比如ISO),所以它是有意隱藏的......現在它是完全通用的,它可能值得移植到' Date類(作爲構造函數接受兩個字符串,或者作爲輸入流的'operator <<')。這會讓它更容易被發現。 – 2014-10-13 10:42:47

3
for(int i = 0; i < expiryDates.size(); i++) 
    { 
    int day, month, year; 
    sscanf(expiryDates[i].c_str(), "%d/%d/%d", &day, &month, &year); 
    QuantLib::Date myQLDate(day, month, year); 
    } 
+0

這看起來像一個好方法,但我的編譯器譴責'QuantLib :: Date' inizialization沒有匹配的構造函數。 – 2014-10-10 14:28:24

+0

不錯,但我會建議通過Boost Date類解析日期,然後從它們訪問日/月/年。再多一層'確保它是有效的日期'。使用QuantLib,無論如何你總是有Boost。 – 2014-10-10 14:30:53

+0

@DirkEddelbuettel,替換'QuantLib :: Date myQLDate(day,month,year);''boost :: gregorian :: date d(day,month,year);'(當然包括'#include「boost/date_time/gregorian/gregorian.hpp「')匹配構造函數,但返回'Year超出有效範圍:1400..10000'。 – 2014-10-10 14:41:29