gpt4 book ai didi

Python - 千位分隔符也适用于小数,保留 4 位有效数字

转载 作者:太空宇宙 更新时间:2023-11-03 14:44:51 26 4
gpt4 key购买 nike

我正在使用 API 来获取有关加密货币 ( https://api.coinmarketcap.com/v1/ticker/?convert=USD ) 的数据,正如你们中的一些人可能知道的那样,加密货币的值(value)可能超过 4000 美元 (BTC) 或低于 0.000001 美元。我必须工作并轻松比较所有这些数字。

在加拿大,我们使用空格字符作为千位分隔符。我希望它适用于数千位,但也可以对十进制数字进行分组。另外,我需要一种方法来仅保留一些有效数字。例如,对于比特币,我不需要小数部分。我希望始终至少有 4 有效数字,这基本上意味着,如果 number >= 1000 ,我不需要小数部分(但我保留完整的整数部分),如果是 < 0 ,我希望在第一个非零数字之后至少有 3 位附加数字(如有必要,可进行四舍五入)。

我想要的输入 => 输出示例:

65410845186.1      => 65 410 845 186
43245.1 => 43 245
285.1234 => 285.1
0.01234567 => 0.123 5
0.001234054 => 0.001 234
0.001034538 => 0.001 035
0.00010001 => 0.000 100 0
1 => 1.000
1.0006 => 1.001

该脚本需要在不同的操作系统上运行。我认为任何 locale 或简单的 format 实现都不能在这里工作。双向添加空格分隔符的最佳方法是什么,使用点作为小数分隔符,同时保留 4 个有效数字(如果需要的话进行四舍五入),除了数字 >= 1000 ,我只保留整数部分?

我从 StackOverflow 上找到的另一段代码中得到了空格分隔符作为千位分隔符:

def splitThousands(s, tSep=' ', dSep=','):
if s.rfind('.')>0:
rhs=s[s.rfind('.')+1:]
s=s[:s.rfind('.')]
if len(s) <= 3: return s + dSep + rhs
return splitThousands(s[:-3], tSep) + tSep + s[-3:] + dSep + rhs
else:
if len(s) <= 3: return s
return splitThousands(s[:-3], tSep) + tSep + s[-3:]

但是,它不考虑有效位数,也不添加小数部分的分隔符。

注意:这些值波动很大,我真的介意极端的极端情况,其中 1.0004999999999 的浮点值将四舍五入为 1.001

最佳答案

不完全是一个干净或简单的解决方案,但这里有一个符合要求的函数:

from math import floor, log10

def format_btc(value, tSep=' ', dSep='.', precision=4, grouping=3):
int_digits = max(int(floor(log10(value))) + 1, 0)
if int_digits >= precision:
int_part = int(round(value))
decimal_part = None
else:
int_part = int(floor(value))
decimal_part = value % 1.0
int_str = str(int_part)[::-1]
int_str = [int_str[i:i + grouping][::-1]
for i in range(0, len(int_str), grouping)]
int_str = tSep.join(reversed(int_str))
if decimal_part is None:
return int_str
if int_digits > 0:
num_decimals = precision - int_digits
else:
decimal_str = "{:.{precision}e}".format(decimal_part, precision=precision - 1)
decimal_pos = -int(decimal_str.split("e")[1])
num_decimals = decimal_pos + precision - 1
decimal_str = "{:.{precision}f}".format(decimal_part, precision=num_decimals)
decimal_str = decimal_str.split(".")[1]
if int_digits > 0:
decimal_str = decimal_str[:precision - int_digits]
decimal_str = [decimal_str[i:i + grouping] for i in range(0, len(decimal_str), grouping)]
decimal_str = tSep.join(decimal_str)
return dSep.join((int_str, decimal_str))

tests = [65410845186.123456, 4324.1, 285.1234, 0.01234567, 0.001234054,
0.001034538, 0.00010001, 1390390000.0, 1.0006]

for test in tests:
print("{:<20f} => {:s}".format(test, format_btc(test)))

输出:

65410845186.123459   => 65 410 845 186
4324.100000 => 4 324
285.123400 => 285.1
0.012346 => 0.012 35
0.001234 => 0.001 234
0.001035 => 0.001 035
0.000100 => 0.000 100 0
1390390000.000000 => 1 390 390 000
1.000600 => 1.001

关于Python - 千位分隔符也适用于小数,保留 4 位有效数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46318302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com