[英]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
转换为double
: static_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
是否在0
到23
之间, m
在0
到59
之间。
是否有一些原因你不想创建一个MilTime
类并重载算术运算符? 这样可以避免您不得不一直转换为/从而更清楚地表达您的意图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.