如何获得小数位数

时间:2015-02-26 17:42:18

标签: python

我如何做以下事项:

>>> num_decimal_places('3.2220')
3 # exclude zero-padding

>>> num_decimal_places('3.1')
1

>>> num_decimal_places('4')
0

我在考虑做:

len((str(number) if '.' in str(number) else str(number) + '.').rstrip('0').split('.')[-1])

还有另一种更简单的方法吗?

7 个答案:

答案 0 :(得分:3)

您可以使用正则表达式来解析value,捕获小数位并计算匹配的长度(如果有):

import re

def num_decimal_places(value):
    m = re.match(r"^[0-9]*\.([1-9]([0-9]*[1-9])?)0*$", value)
    return len(m.group(1)) if m is not None else 0

这比使用多个if else分割字符串要少一些“原始”,但不确定是否更简单或更易读。

答案 1 :(得分:2)

你不需要正则表达式,你可以转换为float并转换回字符串!这会自动删除零:

>>> def convertor(s):
...       try :
...          int(s.rstrip('0').rstrip('.'))
...          return 0
...       except: 
...          return len(str(float(s)).split('.')[-1])
... 
>>> convertor('4.0230')
3
>>> convertor('4.0')
0
>>> convertor('4')
0

答案 2 :(得分:1)

您也可以尝试以下方式:

try:
    return len(str(num).split('.')[1].rstrip('0'))
except
    return 0

答案 3 :(得分:0)

通过字符串处理:

  1. 检查.是否存在于数字字符串中。
  2. 如果不存在则返回0.
  3. 如果按.出现拆分号码字符串,则从拆分结果中获取第二项。
  4. 从右侧删除0。
  5. 返回len项目。
  6. 代码:

    >>> def dCount(no_str):
    ...    if "." in no_str:
    ...         return len(no_str.split(".")[1].rstrip("0"))
    ...    else:
    ...         return 0
    ... 
    >>> dCount("2")
    0
    >>> dCount("2.002")
    3
    >>> dCount("2.1230")
    3
    >>> dCount("2.01230")
    4
    >>> 
    

答案 4 :(得分:0)

import re

def f(s):
    ls = s.split('.', 1)
    if len(ls) == 2 and re.match(r'\d*$', ls[1]):
        return len(ls[1].rstrip('0'))
    return 0

assert f('12') == 0
assert f('12.') == 0
assert f('12.1') == 1
assert f('12.100006') == 6
assert f('12.1.3') == 0
assert f('12.1abc') == 0
assert f('12.100000') == 1

答案 5 :(得分:0)

实现这一目标的最好和最恐怖的方法是:

import decimal
x = '56.001000'
x = x.rstrip('0')  # returns '56.001'
x = decimal.Decimal(x)  # returns Decimal('0.001')
x = x.as_tuple().exponent  # returns -3
x = abs(x)  #returns 3

以上代码可以更简单的方式编写:

>>> x = '56.001000'
>>> abs(decimal.Decimal(x.rstrip('0')).as_tuple().exponent)
3

以下是用于更多参考的已用函数列表:

  1. str.rstrip():返回删除了尾随字符的字符串副本。
  2. decimal.Decimal():根据值构建一个新的Decimal对象。
  3. x.as_tuple():返回格式的namedtuple:DecimalTuple(sign = 0,digits =(1,),exponent = -3)
  4. abs():返回数字的绝对值。

答案 6 :(得分:-1)

您可以尝试在python中使用Decimal函数:

abs(Decimal(string_value).as_tuple().exponent)

如中所述 Easy way of finding decimal places