
humanize 库提供了一个方便的 naturalsize() 函数,用于将字节数转换为人类可读的大小格式(如 k、m、g 等)。在数据展示中,这种格式化能力极大地提升了用户体验。
例如,我们通常会指定一个浮点数格式来控制小数位数:
import humanize format_str = "%.2f" raw1 = 1_048_576 # 1MB raw2 = 1_058_576 # 1.01MB print(humanize.naturalsize(raw1, format=format_str, gnu=True)) print(humanize.naturalsize(raw2, format=format_str, gnu=True))
上述代码的输出将是:
1.00M 1.01M
从上面的输出可以看出,当实际值是整数兆字节(或千字节、吉字节等)时,format="%.2f" 会强制保留两位小数,导致出现 1.00M 这样的结果。这虽然精确,但在视觉上显得有些冗余,通常我们更倾向于看到 1M。然而,对于 1.01M 这样的情况,我们又希望保留小数位。humanize.naturalsize() 本身没有内置选项来智能地处理这种“去除尾随零但不影响非零小数”的需求。
由于 humanize.naturalsize() 无法直接满足此需求,一个有效的策略是对其生成的字符串进行后处理。我们可以定义一个辅助函数,该函数首先调用 humanize.naturalsize(),然后使用正则表达式去除小数点后全是零的部分。
import re
import humanize
def my_format(num, fmt="%.2f"):
"""
格式化数字为人类可读的大小,并去除小数点后冗余的零。
参数:
num (int/float): 要格式化的数字(字节数)。
fmt (str): 传递给 humanize.naturalsize 的浮点数格式字符串。
返回:
str: 格式化后的字符串,例如 "1M", "1.01M"。
"""
# 1. 使用 humanize.naturalsize() 进行初步格式化
n = humanize.naturalsize(num, format=fmt, gnu=True)
# 2. 使用正则表达式进行后处理,去除冗余的 ".00" 或 ".0"
# r"\.0+(?=\D)" 的解释:
# \. : 匹配一个字面量的小数点
# 0+ : 匹配一个或多个零
# (?=\D) : 正向先行断言,确保匹配到的零后面是非数字字符(即大小单位,如 M, K, G, B)。
# 这可以防止意外地删除数字本身中的零。
return re.sub(r"\.0+(?=\D)", "", n)
# 示例使用
raw1 = 1_048_576
raw2 = 1_058_576
raw3 = 1_000 # 1KB
raw4 = 1_234_567_890 # 1.23GB
print(f"原始值: {raw1}, 格式化后: {my_format(raw1)}")
print(f"原始值: {raw2}, 格式化后: {my_format(raw2)}")
print(f"原始值: {raw3}, 格式化后: {my_format(raw3, fmt='%.0f')}") # 即使是0f,如果humanize能输出.0,也能处理
print(f"原始值: {raw4}, 格式化后: {my_format(raw4)}")运行上述代码,将得到以下优化后的输出:
原始值: 1048576, 格式化后: 1M 原始值: 1058576, 格式化后: 1.01M 原始值: 1000, 格式化后: 1KB 原始值: 1234567890, 格式化后: 1.23GB
通过对 humanize.naturalsize() 的输出进行简单的正则表达式后处理,我们能够有效地解决冗余小数位零的问题,使数据大小的显示更加简洁和直观。这种方法在不修改 humanize 库内部逻辑的前提下,提供了一个灵活且强大的定制化方案,适用于需要精细控制输出格式的专业场景。
以上就是优化 humanize.naturalsize() 输出:去除冗余小数位的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号