【发布时间】:2017-09-20 09:30:35
【问题描述】:
我正在使用 API 获取有关加密货币 (https://api.coinmarketcap.com/v1/ticker/?convert=USD) 的数据,并且你们中的一些人可能知道,加密货币的价值可能超过 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。
【问题讨论】:
-
以百万单位表示价值?
-
@ReblochonMasque 这到底是什么意思?
-
0.0001234 * 1,000,000 = 123.40 - 更容易理解和比较
-
什么是
type(value)... 例如,您是在处理整数、浮点数还是小数? -
FWIW,您可能需要考虑
decimali/ofloat类型来处理您正在操作的值的范围以及精度的重要性
标签: python python-3.x number-formatting