[英]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.