如何用Python str.format实现无舍入的至少一位小数格式化?
问题:使用str.format实现特定浮点格式需求
背景
在Python 3中,我接收的是字符串形式的数字,希望以字符串格式传输以保留精度,这样上游服务器可以将其转换为decimal.Decimal类型而不会有精度损失。(注:我已在Stack Overflow等平台多次搜索,未找到相关问题及解答)
核心问题
如何使用str.format实现以下浮点格式要求?若能证明该需求无法通过str.format实现,也可作为有效答案。
简言之,格式需满足:
- 始终保留至少一位小数(即使仅为末尾的0)
- 绝对不进行任何舍入操作
也可接受基于Formatter类的解决方案,但优先考虑str.format的实现方式。同时我也想了解f-strings是否能实现该格式(不允许将示例中的判断表达式嵌入f-string执行)。
格式要求
首选格式规则
- 为区分数字与
int类型,无小数位的整数需添加后缀.0 - 完整保留原字符串中的所有小数位(包括末尾的0)
可替代格式规则
- 去除所有末尾的小数0,但整数必须保留且仅保留一位末尾的
.0 - 保留所有非零小数位,且不进行舍入
输入字符串均为有效的int或Decimal格式,无需处理"42."这类仅含小数点无小数位的情况,也不会出现空字符串。另外,仅通过设置大量小数位(如"{:.28f}".format(1))的方案不被接受。
预期行为示例
我希望用format实现如下效果,当前是通过字符串判断逻辑实现的:
for number in ("42", "4200", "42.0000", "42.34", "42.3400", "42.3456"): string = number if "." in number else number + ".0" print(number, "=>", string)
输出:
42 => 42.0 4200 => 4200.0 42.0000 => 42.0000 42.34 => 42.34 42.3400 => 42.3400 42.3456 => 42.3456
可接受的替代行为示例
以下格式处理逻辑也符合要求:
for number in ("42", "4200", "42.0000", "42.34", "42.3400", "42.3456"): if "." not in number: string = number + ".0" else: stripped = number.rstrip("0") string = stripped + "0" if stripped[-1] == "." else stripped print(number, "=>", string)
输出:
42 => 42.0 4200 => 4200.0 42.0000 => 42.0 42.34 => 42.34 42.3400 => 42.34 42.3456 => 42.3456
内容的提问来源于stack exchange,提问作者NeilG
相关产品推荐
相关产品推荐

