繁体   English   中英

将时间输入转换为float以在C ++中启用数学函数

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

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

另外,我认为我更有能力搞清楚,但无论如何好奇:我如何验证输入以便不允许大于23.59的时间和最后两位大于59的时间?

只是用

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;

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

关于验证,我会在转换之前完成; 一旦你把时间分钟添加到了几个小时,那就太晚了。

您必须分隔数字的整数和小数部分。 您将保持整数部分不变,然后将小数部分除以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之间, m059之间。

是否有一些原因你不想创建一个MilTime类并重载算术运算符? 这样可以避免您不得不一直转换为/从而更清楚地表达您的意图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM