diff --git a/src/humanize/number.py b/src/humanize/number.py index f060b794..0b5b99b7 100644 --- a/src/humanize/number.py +++ b/src/humanize/number.py @@ -548,14 +548,14 @@ def metric(value: float, unit: str = "", precision: int = 3) -> str: return _format_not_finite(value) exponent = int(math.floor(math.log10(abs(value)))) if value != 0 else 0 - if exponent >= 27 or exponent < -24: + if exponent >= 33 or exponent < -30: return scientific(value, precision - 1) + unit value /= 10 ** (exponent // 3 * 3) if exponent >= 3: - ordinal_ = "kMGTPEZY"[exponent // 3 - 1] + ordinal_ = "kMGTPEZYRQ"[exponent // 3 - 1] elif exponent < 0: - ordinal_ = "mμnpfazy"[(-exponent - 1) // 3] + ordinal_ = "mμnpfazyrq"[(-exponent - 1) // 3] else: ordinal_ = "" value_ = format(value, ".%if" % (precision - (exponent % 3) - 1)) diff --git a/tests/test_number.py b/tests/test_number.py index 9f57c64c..e66beed0 100644 --- a/tests/test_number.py +++ b/tests/test_number.py @@ -245,8 +245,14 @@ def test_clamp(test_args: list[typing.Any], expected: str) -> None: ([200_000], "200 k"), ([1e25, "m"], "10.0 Ym"), ([1e26, "m"], "100 Ym"), - ([1e27, "A"], "1.00 x 10²⁷A"), - ([1.234e28, "A"], "1.23 x 10²⁸A"), + ([1e27, "A"], "1.00 RA"), + ([1.234e28, "A"], "12.3 RA"), + ([1.234e-28, "A"], "123 qA"), + ([1.235e29, "A"], "124 RA"), + ([2.56e-30, "V"], "2.56 qV"), + ([2.596e32, "F"], "260 QF"), + ([1e50], "1.00 x 10⁵⁰"), + ([1e-50], "1.00 x 10⁻⁵⁰"), ([-1500, "V"], "-1.50 kV"), ([0.12], "120 m"), ([0.012], "12.0 m"), @@ -254,8 +260,8 @@ def test_clamp(test_args: list[typing.Any], expected: str) -> None: ([0.00012], "120 μ"), ([1e-23], "10.0 y"), ([1e-24], "1.00 y"), - ([1e-25], "1.00 x 10⁻²⁵"), - ([1e-26], "1.00 x 10⁻²⁶"), + ([1e-25], "100 r"), + ([1e-26], "10.0 r"), ([1, "°"], "1.00°"), ([0.1, "°"], "100m°"), ([100], "100"),