将时间输入转换为浮点数以启用C++中的数学函数

Convert time input to a float to enable math functions in C++

本文关键字:C++ 函数 启用 输入 时间 转换 浮点数      更新时间:2023-10-16

我要求用户以这种格式输入开始时间和结束时间:15.45(军事时间,用小数而不是冒号(,我需要将这些时间转换为浮点数以对它们执行计算。 我很难将一小时的 60 分钟转换为十进制值。 例如 - 用户输入的开始为 12.45 和结束于 14.15,这应分别转换为 12.75 和 14.25。 我将如何进行此转换?

另外,我相信我更有能力弄清楚,但无论如何都很好奇:我将如何验证输入,以免允许时间大于 23.59 并且不允许最后两位数大于 59 的时间?

只要其中一个值被double,那么算术将是在double年完成,结果double。 因此,您可以转换 minutes double ,使用三种C++语法中的任何一种: static_cast<double>(minutes)double(minutes)(double)minutes ,或者只是除以 60.0 ,而不是整数60。 (我喜欢成为明确,所以我会写double(minutes) / 60.0. 有些人更喜欢 static_cast,即使在这种情况下。

关于验证,我会在转换之前进行; 一旦你将分钟加到小时,反正为时已晚。

只需使用

double time = hours + minutes / 60.0;
bool hoursValid = hours < 24; // hours are unsigned, right?
bool minutesValid = minutes < 60;

例:

char buf[] = "9.45";
unsigned int hours, minutes;
sscanf(buf, "%d.%d", &hours, &minutes);
printf("%f", hours + minutes/60.0); // outputs 9.75

如果输入double 9.45,则需要#include <cmath>并将其拆分为

hours = floor(v);
minutes = (v - hours) * 100;

您必须将数字的整数和小数部分分开。您将保持整数部分不变,然后将小数部分除以 60 添加到其中。

一旦您分为小时和分钟,验证也很简单。

我将假设您的代码将用户的值作为字符串读取。 您需要在小数点处解析用户输入,以将小时和分钟作为两个单独的值。 一旦有了它,您就可以将分钟转换为一小时的几分之一,并将其添加到小时数中。

bool military_time_valid(float a) {
    int t = (int)a;
    if (t >= 24)
        throw std::runtime_error("invalid hours");
    if (a-t >= .6)
        throw std::runtime_error("invalid minutes");
}
float military_to_decimal(float a) {
    int t = (int)a;
    return t + (a-t)/.6;
}
float decimal_to_military(float a) {
    int t = (int)a;
    return t + (a-t)*.6;
}
float t = 15.45;
int h = (int) t;
float m = 100 * (t - h);
printf("%f", h + m / 60);

给出输出:15.750000

检查h是否在 023 之间,m是否在 059 之间。

您是否有

理由不想创建MilTime类并重载算术运算符? 这将使您不必一直转换,并且可以更清楚地说明您的意图。