如何将浮点数切换为时间格式

How can you switch a float to a time format?

本文关键字:时间 格式 浮点数      更新时间:2023-10-16

你好,我是初学者,所以请善待:)..

在C++中,如果我有一个像 12.5 或 13.25 这样的浮点数,我怎样才能将其转换为显示为 12:30 和 13:15?

非常感谢。

float time = ...;

浮点数转换为整数将砍掉小数部分,留给您时间。

int hour = static_cast<int>(time);

如果你减去小时,那么剩下的就是分钟作为一小时的几分之一。 如果将其乘以 60,则在几分钟内得到余数。 再次,投射到一个 int 来砍掉秒数,只剩下几分钟。

int minute = static_cast<int>((time-hour)*60);

然后显示小时和冒号。 要正确显示分钟,请告诉它始终使用 2 个字符的宽度,并用"0"填充空白。 这使得它说02而不仅仅是2

std::cout << hour << ':' << std::setw(2) << std::fill('0') << minute;

与任何问题一样,您需要将其分解为多个组成部分并分别攻击每个组成部分。

您拥有的:

  • 浮点小时数。

您需要什么:

  • 打印整数小时数。
  • 打印":"
  • 将小时数按 60 分钟的比例打印。

所以,现在,我们可以解决问题的每个部分。

假设输入为:

const float time = 13.25;

第一部分非常简单 — 截断浮点变量可以使用数学floor函数来完成,但您真正需要做的就是转换为 int 以获得相同的效果:

std::cout << (unsigned int)time;

第二部分也非常简单:

std::cout << ':';

第三部分需要做更多的工作。我们需要丢弃除小数部分以外的所有内容。我们可以通过减去整数部分来做到这一点:

time - (unsigned int)time

然后我们必须转换该值,以便它不是范围 [0.00,1.00) 的比例,而是范围 [0,60) 的比例,只需乘以 60

60 * (time - (unsigned int)time)

我们只剩下:

const float time = 13.25;
std::cout << (unsigned int)time;
std::cout << ':';
std::cout << 60 * (time - (unsigned int)time);
// result: 13:15

(现场演示)


对于一般解决方案,如果只有一个数字,我们还希望显示前导零:

const float time = 12.10;
std::cout << (unsigned int)time;
std::cout << ':';
std::cout << std::setw(2) << std::setfill('0');
std::cout << 60 * ((time - (unsigned int)time) / 100);
// result: 12:06

实际上,为了避免舍入错误和可能的溢出,您可以完全删除float并简单地存储整数分钟数:

const unsigned int time_mins = (12*60) + 6;
std::cout << (time_mins / 60);
std::cout << ':';
std::cout << std::setw(2) << std::setfill('0');
std::cout << (time_mins % 60);
// result: 12:06

(现场演示)

或者,你知道,使用实际的时间/日期类型。