Страницы

Поиск по вопросам

воскресенье, 26 мая 2019 г.

Обработка строки даты

Пользователь вводит дату в формате 01/02/17, нужно сохранить дату в трёх переменных int соответственно-daymonthyear. Я разбивал строку с датой на 3 подстроки и переводил в каждую в int. Мне кажется-не самый лучший способ. Есть ли како-то более удачное решение для такой обработки?


Ответ

Можно и удобно регэкспами:
#include #include
std::vector GetDigitDate(const std::string Date) { std::regex Rx("^(\\d{1,2})/(\\d{1,2})/(\\d{2}|\\d{4})$"); std::smatch Match; if(!(std::regex_match(Date, Match, Rx) && (Match.size()==4))) throw std::runtime_error(""); return {std::stoi(Match[1]),std::stoi(Match[2]),std::stoi(Match[3])}; }
int main() { try { std::vector T = GetDigitDate("1/07/2011"); for(const auto &i:T) std::cout << i << std::endl; } catch(...) { std::cout << "Что-то не так!" << std::endl; } return 0; }
Естественно, при желании, можно дополнить проверку корректности дней, месяцев и годов. В коде - простейшая проверка просто на числа.
ADD:
Если не нравится возврат вектора, в качестве результата, небольшая модификация кода, но для C++1z
#include #include
std::tuple GetDigitDate(const std::string Date) { std::regex Rx("^(\\d{1,2})/(\\d{1,2})/(\\d{2}|\\d{4})$"); std::smatch Match; if(!(std::regex_match(Date, Match, Rx) && (Match.size()==4))) throw std::runtime_error(""); return {std::stoi(Match[1]),std::stoi(Match[2]),std::stoi(Match[3])}; }
int main() { try { auto [d,m,y] = GetDigitDate("1/07/2011"); std::cout << "d: " << d << " m: " << m << " y: " << y << std::endl; } catch(...) { std::cout << "Что-то не так!" << std::endl; } return 0; }

Комментариев нет:

Отправить комментарий