2014-10-10 28 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