| | """ |
| | Formatting numeric literals. |
| | """ |
| | from blib2to3.pytree import Leaf |
| |
|
| |
|
| | def format_hex(text: str) -> str: |
| | """ |
| | Formats a hexadecimal string like "0x12B3" |
| | """ |
| | before, after = text[:2], text[2:] |
| | return f"{before}{after.upper()}" |
| |
|
| |
|
| | def format_scientific_notation(text: str) -> str: |
| | """Formats a numeric string utilizing scentific notation""" |
| | before, after = text.split("e") |
| | sign = "" |
| | if after.startswith("-"): |
| | after = after[1:] |
| | sign = "-" |
| | elif after.startswith("+"): |
| | after = after[1:] |
| | before = format_float_or_int_string(before) |
| | return f"{before}e{sign}{after}" |
| |
|
| |
|
| | def format_complex_number(text: str) -> str: |
| | """Formats a complex string like `10j`""" |
| | number = text[:-1] |
| | suffix = text[-1] |
| | return f"{format_float_or_int_string(number)}{suffix}" |
| |
|
| |
|
| | def format_float_or_int_string(text: str) -> str: |
| | """Formats a float string like "1.0".""" |
| | if "." not in text: |
| | return text |
| |
|
| | before, after = text.split(".") |
| | return f"{before or 0}.{after or 0}" |
| |
|
| |
|
| | def normalize_numeric_literal(leaf: Leaf) -> None: |
| | """Normalizes numeric (float, int, and complex) literals. |
| | |
| | All letters used in the representation are normalized to lowercase.""" |
| | text = leaf.value.lower() |
| | if text.startswith(("0o", "0b")): |
| | |
| | pass |
| | elif text.startswith("0x"): |
| | text = format_hex(text) |
| | elif "e" in text: |
| | text = format_scientific_notation(text) |
| | elif text.endswith("j"): |
| | text = format_complex_number(text) |
| | else: |
| | text = format_float_or_int_string(text) |
| | leaf.value = text |
| |
|