Skip to content

Commit fe8421e

Browse files
committed
Human: Fix num2si dropping SI prefix for values in [1, 1000]
'num2si()' had an early-return shortcut for values already in [1, 1000) that returned '{value}{base_unit}', discarding the SI prefix parsed from the unit string. For example, 444.584 with unit "us" (sipfx="u", base_unit="s") was returned as "444.58s" instead of "444.58us". The early return is only valid when no SI prefix is present, i.e. the value is already expressed in base units. Add 'not sipfx' to the condition so prefixed units fall through to the full scaling logic. Add test cases to 'test_num2si()' covering values in [1, 1000) with SI-prefixed units (us, ms, mW). Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
1 parent 8130fe7 commit fe8421e

3 files changed

Lines changed: 23 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ Versioning practices: [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
55

66
## [ADD NEW VERSION HERE] - ADD DATE HERE
77
### Fixed
8+
- Fix 'num2si()' function, which lead to incorrect units conversion in some
9+
cases.
810
### Added
911
### Removed
1012
### Changed

pepclibs/helperlibs/Human.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ def num2si(value: int | float,
206206
sipfx, base_unit = separate_si_prefix(unit)
207207
value = float(value)
208208

209-
if abs(value) >= 1 and abs(value) < 1000:
209+
# No scaling is needed for values in [1, 1000) with no SI prefix.
210+
if not sipfx and abs(value) >= 1 and abs(value) < 1000:
210211
result = f"{value:.{decp}f}"
211212
if strip_zeroes and "." in result:
212213
result = result.rstrip("0").rstrip(".")

tests/test_human.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,25 @@ class _Num2SiTestDataType(TypedDict, total=False):
198198
"unit": "W", "decp": 0, "sep": " ", "strip_zeroes": False, "result": "2 EW"},
199199
{"value": 1999 * 1000 * 1000 * 1000 * 1000 * 1000,
200200
"unit": "MW", "decp": 0, "sep": " ", "strip_zeroes": False, "result": "1999000 EW"},
201+
# Values in [1, 1000) with an SI-prefixed unit must preserve the prefix.
202+
{"value": 444.584,
203+
"unit": "us", "decp": 2, "sep": None, "strip_zeroes": False, "result": "444.58us"},
204+
{"value": 1.0,
205+
"unit": "us", "decp": 2, "sep": None, "strip_zeroes": False, "result": "1.00us"},
206+
{"value": 999.0,
207+
"unit": "us", "decp": 2, "sep": None, "strip_zeroes": False, "result": "999.00us"},
208+
{"value": 1.0,
209+
"unit": "ms", "decp": 2, "sep": None, "strip_zeroes": False, "result": "1.00ms"},
210+
{"value": 500.0,
211+
"unit": "ms", "decp": 2, "sep": " ", "strip_zeroes": False, "result": "500.00 ms"},
212+
{"value": 999.0,
213+
"unit": "ms", "decp": 2, "sep": " ", "strip_zeroes": False, "result": "999.00 ms"},
214+
{"value": 1.0,
215+
"unit": "mW", "decp": 2, "sep": " ", "strip_zeroes": False, "result": "1.00 mW"},
216+
{"value": 500.0,
217+
"unit": "mW", "decp": 1, "sep": " ", "strip_zeroes": True, "result": "500 mW"},
218+
{"value": 999.0,
219+
"unit": "mW", "decp": 0, "sep": " ", "strip_zeroes": False, "result": "999 mW"},
201220
]
202221

203222
def test_num2si():

0 commit comments

Comments
 (0)