Skip to content

Commit e9df3f7

Browse files
nuztalgiaDaniel Gillet
authored andcommitted
Support float in precisedelta and fix bugs to make new tests pass.
1 parent 3a5ff46 commit e9df3f7

1 file changed

Lines changed: 11 additions & 4 deletions

File tree

src/humanize/time.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ def _abs_timedelta(delta: dt.timedelta) -> dt.timedelta:
6565
return delta
6666

6767

68-
def _date_and_delta(value: Any, *, now: dt.datetime | None = None) -> tuple[Any, Any]:
68+
def _date_and_delta(
69+
value: Any, *, now: dt.datetime | None = None, precise: bool = False
70+
) -> tuple[Any, Any]:
6971
"""Turn a value into a date and a timedelta which represents how long ago it was.
7072
7173
If that's not possible, return `(None, value)`.
@@ -82,7 +84,7 @@ def _date_and_delta(value: Any, *, now: dt.datetime | None = None) -> tuple[Any,
8284
delta = value
8385
else:
8486
try:
85-
value = int(value)
87+
value = value if precise else int(value)
8688
delta = dt.timedelta(seconds=value)
8789
date = now - delta
8890
except (ValueError, TypeError):
@@ -464,7 +466,7 @@ def _suppress_lower_units(min_unit: Unit, suppress: Iterable[Unit]) -> set[Unit]
464466

465467

466468
def precisedelta(
467-
value: dt.timedelta | int | None,
469+
value: dt.timedelta | float | None,
468470
minimum_unit: str = "seconds",
469471
suppress: Iterable[str] = (),
470472
format: str = "%0.2f",
@@ -535,7 +537,7 @@ def precisedelta(
535537
536538
```
537539
"""
538-
date, delta = _date_and_delta(value)
540+
date, delta = _date_and_delta(value, precise=True)
539541
if date is None:
540542
return str(value)
541543

@@ -605,9 +607,14 @@ def precisedelta(
605607
("%d microsecond", "%d microseconds", usecs),
606608
]
607609

610+
import re
611+
round_fmt_value = re.fullmatch(r"%\d*(d|(\.0*f))", format)
612+
608613
texts: list[str] = []
609614
for unit, fmt in zip(reversed(Unit), fmts):
610615
singular_txt, plural_txt, fmt_value = fmt
616+
if round_fmt_value:
617+
fmt_value = round(fmt_value)
611618
if fmt_value > 0 or (not texts and unit == min_unit):
612619
_fmt_value = 2 if 1 < fmt_value < 2 else int(fmt_value)
613620
fmt_txt = _ngettext(singular_txt, plural_txt, _fmt_value)

0 commit comments

Comments
 (0)