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"
呢?