2014-10-10 3 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 для вас, -1 для документации QuantLib. –

+0

Правда. До одного или двух лет назад эта функция была довольно ограничена (она могла анализировать только несколько конкретных форматов, таких как ISO), поэтому она была специально скрыта по назначению ... Теперь, когда она полностью родовая, возможно, стоит перейти к ' Date' (либо в качестве конструктора, берущего две строки, либо как 'operator <<' для входных потоков). Это сделало бы его гораздо более доступным. –

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'. –

+0

Приятно, но я предлагаю разобрать дату через классы Boost Date, а затем получить доступ к ним в день/месяц/год. Еще один слой «убедитесь, что это действительная дата». В QuantLib у вас всегда есть Boost. –

+0

@DirkEddelbuettel, заменяющий 'QuantLib :: Date myQLDate (день, месяц, год);' by 'boost :: gregorian :: date d (день, месяц, год);' (конечно, с правильным '#include" boost/date_time/gregorian/gregorian.hpp ") сопоставляет конструктор, но возвращает' Год вне допустимого диапазона: 1400..10000'. –