簡體   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