Skip to content

Commit e07c07d

Browse files
committed
Update formatters.py
1 parent 624239b commit e07c07d

File tree

1 file changed

+78
-9
lines changed

1 file changed

+78
-9
lines changed

app/utils/formatters.py

Lines changed: 78 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,78 @@
1-
def format_large_number(number):
2-
"""Format large numbers to K, M, B format"""
3-
if number >= 1_000_000_000:
4-
return f"{number/1_000_000_000:.1f}B"
5-
elif number >= 1_000_000:
6-
return f"{number/1_000_000:.1f}M"
7-
elif number >= 1_000:
8-
return f"{number/1_000:.1f}K"
9-
return str(int(number))
1+
def format_large_number(number, decimals=2, concise_format=True):
2+
"""
3+
Converts a number in scientific notation (string format) to a concise, readable decimal string.
4+
5+
This function takes a string representing a number in scientific notation and formats it
6+
into a more user-friendly, concise decimal string. It offers options for concise formatting,
7+
such as removing trailing zeros and using abbreviations for large numbers (e.g., K, M, B, T).
8+
9+
Args:
10+
number (str): The number in scientific notation as a string (e.g., "1.23E+06").
11+
decimals (int, optional): The number of decimal places to round to in the initial formatting.
12+
Defaults to 2. Must be a non-negative integer.
13+
concise_format (bool, optional): If True, applies concise formatting (removes trailing zeros and
14+
uses abbreviations for large numbers). If False, returns standard
15+
fixed-point formatting. Defaults to True.
16+
17+
Returns:
18+
str: A string representing the number in a concise decimal format if concise_format is True,
19+
or standard decimal format if False.
20+
Returns "Invalid Input: Not a valid scientific number" if the input string is invalid.
21+
22+
Raises:
23+
TypeError: if `number` is not a string or `decimals` is not an integer.
24+
ValueError: if `decimals` is a negative integer.
25+
26+
Example:
27+
>>> format_scientific_notation_concise("1.13757508810854E14")
28+
'113.76T'
29+
>>> format_scientific_notation_concise("1.13757508810854E14", concise_format=False)
30+
'113757508810854.00'
31+
>>> format_scientific_notation_concise("2.5e-3", decimals=4)
32+
'0.0025'
33+
>>> format_scientific_notation_concise("1234567", concise_format=True)
34+
'1.23M'
35+
>>> format_scientific_notation_concise("1234", concise_format=True)
36+
'1.23K'
37+
>>> format_scientific_notation_concise("123", concise_format=True)
38+
'123'
39+
"""
40+
number = str(number)
41+
if decimals < 0:
42+
raise ValueError("Input 'decimals' must be a non-negative integer.")
43+
if not isinstance(concise_format, bool):
44+
raise TypeError("Input 'concise_format' must be a boolean.")
45+
46+
47+
try:
48+
number = float(number)
49+
50+
if not concise_format:
51+
return f"{number:.{decimals}f}" # Standard formatting
52+
53+
# Concise formatting logic
54+
magnitude = 0
55+
suffix = ''
56+
if abs(number) >= 1000:
57+
magnitude_suffixes = ['', 'K', 'M', 'B', 'T', 'P', 'E', 'Z', 'Y']
58+
magnitude = 0
59+
temp_number = abs(number)
60+
while temp_number >= 1000 and magnitude < len(magnitude_suffixes) - 1:
61+
magnitude += 1
62+
temp_number /= 1000.0
63+
suffix = magnitude_suffixes[magnitude]
64+
number /= (1000**magnitude)
65+
66+
67+
formatted_number = f"{number:.{decimals}f}{suffix}"
68+
69+
# Remove trailing zeros after decimal point if concise format is requested
70+
if concise_format and '.' in formatted_number:
71+
formatted_number = formatted_number.rstrip('0').rstrip('.') if formatted_number.endswith('0') or formatted_number.endswith('.') else formatted_number
72+
73+
74+
return formatted_number
75+
76+
except ValueError:
77+
return "Invalid Input: Not a valid scientific number"
78+

0 commit comments

Comments
 (0)