@@ -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
466468def 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