数据结构与算法-python实现任意数字字符串(可含小数)转数字

背景介绍

       在上一篇文章里,我们介绍了整数字符串转数字的算法,在本篇文章里,我们更进一步,将任意数字字符串,包括小数,整数形式的字符串转成对应的数值。整数部分我们已经实现了,所以我们着重要解决的是将小数部分的转成对应数值,再结合整数部分,就将一个完整的数字字符串转换成了对应数值

小数部分转换思路

      在整数部分里,我们得到一个个单字符后,依次将对应位置的字符转换成其对应的数字,然后分别乘以其对应位置的系数(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

猜你喜欢

转载自blog.csdn.net/dinghua_xuexi/article/details/107259455
今日推荐