Как преобразовать секунды в формат чч: мм: сс.миллисекунды с ++? - PullRequest
0 голосов
/ 04 ноября 2019

Мне нужно преобразовать секунды в чч: мм: сс.миллисекунды, и мне нужно, чтобы этот формат соблюдался. Я имею в виду, что часы, минуты и секунды должны иметь 2 цифры, а миллисекунды - 3 цифры. Например, если секунд = 3907,1, я хотел бы получить 01: 05: 07.100

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <stdio.h>
#include <sstream>
#include <math.h>
using namespace std;

int main()
{   
    double sec_tot = 3907.1;
    double hour = sec_tot/3600; // seconds in hours
    double hour_int;
    double hour_fra = modf(hour, &hour_int );//split integer and decimal part of hours
    double minutes = hour_fra*60; // dacimal hours in minutes
    double minutes_int;
    double minutes_fra = modf(minutes, &minutes_int); // split integer and decimal part of minutes
    double seconds = minutes_fra*60; // decimal minutes in seconds
    stringstream ss;
    ss << ("%02lf", hour_int) << ":" << ("%02lf", minutes_int) << ":" << ("%02lf", seconds);
    string time_obs_def = ss.str();
    cout << time_obs_def << endl;

    return 0;
}

, но результат будет 1: 5: 7.1 Спасибо.

Ответы [ 3 ]

2 голосов
/ 04 ноября 2019

В настоящее время вам, вероятно, следует использовать длительность хронографа std :: chrono :: milliseconds для такой задачи, но если вы хотите создать наш собственный тип для поддержки форматирования, что-то вроде этого должно сделать это:

#include <iomanip>   // std::setw & std::setfill
#include <iostream>

// your own type
struct seconds_t {
    double value;
};

// ostream operator for your type:
std::ostream& operator<<(std::ostream& os, const seconds_t& v) {
    // convert to milliseconds
    int ms = static_cast<int>(v.value * 1000.);

    int h = ms / (1000 * 60 * 60);
    ms -= h * (1000 * 60 * 60);

    int m = ms / (1000 * 60);
    ms -= m * (1000 * 60);

    int s = ms / 1000;
    ms -= s * 1000;

    return os << std::setfill('0') << std::setw(2) << h << ':' << std::setw(2) << m
              << ':' << std::setw(2) << s << '.' << std::setw(3) << ms;
}

int main() {
    seconds_t m{3907.1};
    std::cout << m << "\n";
}
1 голос
/ 04 ноября 2019

В C ++ 20:

#include <chrono>
#include <iostream>

using namespace std;
using namespace std::chrono;

int
main()
{
    double sec_tot = 3907.1;
    cout << format("{:%T}\n", round<milliseconds>(duration<double>{sec_tot}));
}
0 голосов
/ 04 ноября 2019

printf спецификаторы формата стиля не работают. Вам нужно будет использовать потоковые манипуляторы для установки width и символа заполнения .

ss << std:setw(2) << std::setfill('0') << hour_int;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...