我如何做以下事项:
>>> 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])
还有另一种更简单的方法吗?
答案 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)
通过字符串处理:
.
是否存在于数字字符串中。.
出现拆分号码字符串,则从拆分结果中获取第二项。代码:
>>> 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
以下是用于更多参考的已用函数列表:
答案 6 :(得分:-1)
您可以尝试在python中使用Decimal
函数:
abs(Decimal(string_value).as_tuple().exponent)