基于重要数字的Python字符串转换

时间:2013-09-27 19:13:03

标签: python

我在Python中寻找基于有效数字(数字)的字符串转换函数/模块。这个功能的用处已经出现了好几次,所以很难相信Python 仍然没有功能或模块来轻松完成这项工作。有谁知道有什么新的东西出来了吗?如果没有,这是一个功能请求的好机会吗?

免责声明:

  1. 我意识到这是一个已经存在几个问题的话题,但其中大多数都已有几年了。我希望最近发布了一些有用的东西,看起来很有用。
  2. 我也意识到编写一个手动执行此操作的功能相对简单,但我更喜欢一个模块或(更好)内置函数来实现可移植性。
  3. 我不是在寻找输出为指数表示法
  4. 功能示例:

    >>> from somemodule import SDStr
    
    >>> SDStr(num=1234, sigDigs=3)
    '1230'
    
    >>> SDStr(num=12.3456, sigDigs=4)
    '12.35'
    
    >>> SDStr(num=100, sigDigs=3)
    '100.'
    
    >>> SDStr(num=100.0, sigDigs=2)
    '100'
    
    >>> SDStr(num=100, sigDigs=4)
    '100.0'
    
    >>> SDStr(num=0.001234, sigDigs=2)
    '0.0012'
    

1 个答案:

答案 0 :(得分:0)

import decimal

def rounded(number, figures):
    number = decimal.Decimal(number)
    return format(round(number, -number.adjusted()-1+figures), "f")

decimal跟踪小数位数,所以显然这是做事的方式。

我只是根据最重要数字的位置调整有效数字的数量,并将其格式化为浮点数。它就像一个魅力。

编辑:由于某些原因,Python 2不喜欢这个。我会调查一下。

好吧,基本上在Python 2中round强制转换为float(严重的是,转到Python 3),所以答案很简单:

from decimal import Decimal

def rounded(number, figures):
    number = Decimal(number)
    decimal_shift = -number.adjusted()-1+figures
    integral = round(number * Decimal(10) ** decimal_shift)
    rounded_decimal = Decimal(integral) * Decimal(10) ** -decimal_shift
    return format(rounded_decimal, "f")