背景介绍
在上一篇文章里,我们介绍了整数字符串转数字的算法,在本篇文章里,我们更进一步,将任意数字字符串,包括小数,整数形式的字符串转成对应的数值。整数部分我们已经实现了,所以我们着重要解决的是将小数部分的转成对应数值,再结合整数部分,就将一个完整的数字字符串转换成了对应数值
小数部分转换思路
在整数部分里,我们得到一个个单字符后,依次将对应位置的字符转换成其对应的数字,然后分别乘以其对应位置的系数(10的次幂), 然后将各部分组合即可。类似地,在处理小数部分时,也是如此,不过在得到各位字符的对应数字后,不是乘以系数,而是除以系数。然后再将得到的各部分组合,即可得到小数部分字符串对应的数值。
总体思路
得到了整数部分数值,小数部分数值后,将两者相加,即为整个数字字符串对应的数值,这一步很容易理解,不过多解释。
程序详情
# 处理任意数字字符串的主方法
def numberstr2num(num_str):
'''
能完美处理整数小数字符串转数字的算法
:param num_str:
:return:
'''
import re
assert isinstance(num_str, str)
if num_str and re.match('(-|\\+)?\\d+(\\.\\d+)?', num_str):
capital_char = num_str[0]
if capital_char == '-' or capital_char == '+':
num_str = num_str[1:]
segs = num_str.split('.')
# 整数部分字符串
num_seg = segs[0]
# 得到整数部分数值
total_num = str2num(num_seg)
# 存在小数部分字符串
if len(segs) == 2:
point_num_seg = segs[1]
# 加上小数部分数值
total_num += pointstr2num(point_num_seg)
return total_num if not capital_char == '-' else 0 - total_num
def str2num(num_str):
'''
整数字符串转成数字
:param num_str:
:return:
'''
# 主方法已经验证过数字有效性,这里就不必再验证了
index = 0
str_len = len(num_str)
num = 0
for c in num_str:
index += 1
num += (ord(c) - 48) * pow(10, str_len - index)
return num
def pointstr2num(point_str):
'''
小数部分字符串转成数字
:param point_str:
:return:
'''
# 主方法已经验证过数字有效性,这里就不必再验证了
index = 0
point_num = 0
for c in point_str:
index += 1
point_num += (ord(c) - 48) / pow(10, index)
return point_num
验证算法
if __name__ == '__main__':
print(numberstr2num('-123.567')) # 结果为 -123.567
print(numberstr2num('+123.567')) # 结果为 123.567
print(numberstr2num('123.5')) # 结果为 123.5
print(numberstr2num('575')) # 结果为 575