如何float一个字符串


#算法#


2014-09-17

现在有一个由数字和小数点组成的字符串,如何实现将其转换为一个浮点数。

思路1:
将字符串通过小数点拆分成整数部分和小数部分,分别处理。

思路2: 先不考虑小数点的问题,将字符串转换成整数,根据小数点的位置,将获得的整数转成浮点数。代码如下:

# !/usr/bin/python
# -*-encoding:utf-8-*-
'''
Created on 2014年9月17日
@author: letian
'''

def my_float(s):
    '''不考虑正负号'''
    value = 0.0
    dot_position = 0
    status = False
    for ch in s:
        if ch != '.' :
            value = value*10 + (ord(ch) - 48) 
            if not status:
                dot_position += 1
        else:
            status = True
    return value/(10 ** (len(s)-dot_position-1))
        
        
if __name__ == '__main__':
    s = "11223.51212"
    print my_float(s)

ord()函数是将字符转换成ASCII码值。字符0的ASCII码值为48。dot_position是小数点在字符串s中的位置。

但是

上面的代码很有问题的:

1、在64位系统中,python整型可以表示的范围是:

>>> import sys
>>> (-sys.maxint-1, sys.maxint)
(-9223372036854775808, 9223372036854775807)
>>> 9223372036854775807+1
9223372036854775808L

超出这一范围,自动转换为长整型。长整型可以表示任意大的整数。

但是,如果使用C、Java的int类型存储转换后的整数,要考虑是否溢出(如果溢出可以考虑抛出异常),以Java为例子:

int maxInt = Integer.MAX_VALUE;
System.out.println(maxInt);
System.out.println(maxInt+1);

输出为:

2147483647
-2147483648

那么如何判断溢出呢? 如果最终用int保存最后的数字,可以先用long int保存最后的数字,判断是否超出int所能表示的范围,若没有超出,则转换为int;否则,抛出异常。

2、浮点型也是有范围的。

3、若给转换函数的参数不是字符串,那么应该抛出异常。上面的代码没有处理。

4、对于"12e-2"这种字符串转换为数字没有处理。

5、如果给出的字符串是"123as21"呢?应该抛出异常。

6、如果给出的字符串是"+123"呢?


( 本文完 )