当计时器达到负数时格式化倒计时计时器



我有一个Int,这个Int与分钟数有关。我使用以下代码将这个Int转换为小时、分钟和秒,所有这些都很好,直到计时器低于0。

let hours = Int(timeRemaining) / 3600
let minutes = Int(timeRemaining) / 60 % 60
let seconds = Int(timeRemaining) % 60
timeLeftLabel.text = String(format:"%02i:%02i:%02i", hours, minutes, seconds)

上面代码的输出看起来像这样,它完美地倒计时:02:56:07

但是,一旦时间达到0,格式就会开始如下所示:-2:-56:-7(这显然是在负2小时后,它不会立即跳到负2小时,我只是想强调这一点(

正如你所看到的,这里有很多问题,首先是减号,我只想在开头有一个减号。那么0从小时和秒中消失了,它应该简单地读取:-02:56:07

我能想到的唯一方法是使用:replacingOccurrences(of(,但我想知道是否有更好的选择?

非常感谢任何建议。

更好的解决方案是使用DateComponentsFormatter

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.zeroFormattingBehavior = .pad

示例

let timeRemaining: TimeInterval = 2 * 60 * 60 + 56 * 60 + 7
let negative = -1 * timeRemaining
print(formatter.string(from: timeRemaining)!)
print(formatter.string(from: negative)!)

02:56:07
-02:56:07

因为你只想在整个字符串前面有一个负号,所以从区间的绝对值开始计算,如果原始值是负数,就在负号前面加负号。

(但我同意最好使用格式化程序而不使用算术。(

最新更新