Формат отрицательных миллисекунд - PullRequest
0 голосов
/ 24 августа 2018

У меня есть функция, которая конвертирует миллисекунды в формат h: m: s.ms, и это работает.

Однако у меня есть одна проблема, которая касается отрицательных чисел.

код

def timer(ms):
    s = ms / 1000
    m, s = divmod(s, 60)
    h, m = divmod(m, 60)
    #d,h = divmod(h,24)
    d = ms % 1000

    if h > 0:
        return "{0}:{1}:{2}.{3}".format(int(h), str(int(m)).zfill(2), str(int(s)).zfill(2), str(int(d)).zfill(3))
    elif m > 0:
        return "{0}:{1}.{2}".format(int(m), str(int(s)).zfill(2), str(int(d)).zfill(3))
    else:
        return "{0}.{1}".format(int(s), str(int(d)).zfill(3))


print(timer(13700)) 

# returns 13.700 as expected

-

Когда я даю отрицательные миллисекунды, например, -13700

print(timer(-13700))

возвращает

59:46.300

но ожидаемый результат, который я хочу, равен -13.700

Как я могу решить это?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Хороший подход к решению этой проблемы:

  1. определить знак
  2. используйте абсолютное значение (абс) для арифметики
  3. добавить знак обратно на выход

Таким образом, изменение вашего кода будет выглядеть так:

def timer(ms):
    sign = ms//abs(ms) if ms != 0 else 0 # <---  Step 1
    ms = abs(ms)                         # <---  Step 2
    s = ...
    ...        
    if sign == -1:                       # <---  Step 3
       output = "-"+output
    return output        
0 голосов
/ 24 августа 2018

Самый простой способ - обнаружить отрицательные входные данные, получить их абсолютные значения, а затем поставить - на передний план при их возврате:

def timer(ms):
    if ms < 0:
        return "-" + timer(abs(ms))
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...