解析字符串为float或int


在Python中,我如何分析一个数字串“545.2222”对应的浮点值,542.2222?或解析字符串“31”为一个整数,31?

我只是想知道如何解析浮弦浮,和(分别)int字符串int。
已邀请:

fool1025

赞同来自:


浮(“545.2222”)和int(浮动(“545.2222”))

gsc11111

赞同来自:

>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545

shel_lee

赞同来自:


codelogic哈雷是正确的,但记住,如果你知道字符串是一个整数(例如545)你可以调用int(“545”)不先铸造浮动。

如果字符串列表中,您可以使用地图功能以及。
>>> x = ["545.0", "545.6", "999.2"]
>>> map(float, x)
[545.0, 545.60000000000002, 999.20000000000005]
>>>

i_yeacle

赞同来自:


这是你的问题的另一种解读。(提示:这是模糊的)可能是你在寻找这样的事情。
def parseIntOrFloat( aString ):
return eval( aString )


这样工作……
>>> parseIntOrFloat("545.2222")
545.22220000000004
>>> parseIntOrFloat("545")
545

baiychenvip

赞同来自:

def num(s):
try:
    return int(s)
except ValueError:
    return float(s)

stevphen

赞同来自:

float(x) if '.' in x else int(x)

hucice

赞同来自:


你需要考虑舍入要做到这一点。

即int(5.1)= > 5
int(5.6)= > 5——不对,应该是6,所以我们做的int(5.6 + 0.5)= > 6
def convert(n):
try:
    return int(n)
except ValueError:
    return float(n + 0.5)

hustccb

赞同来自:


这个问题似乎有点老。但让我提出一个函数parsestr使某物相似,即返回整数或浮点数,如果一个给定的ASCII字符串不能转换为他们没有返回它不变。当然该代码可能调整只做你想要什么:
>>> import string
>>> parseStr = lambda x: x.isalpha() and x or x.isdigit() and \
...                      int(x) or x.isalnum() and x or \
...                      len(set(string.punctuation).intersection(x)) == 1 and \
...                      x.count('.') == 1 and float(x) or x
>>> parseStr('123')
123
>>> parseStr('123.3')
123.3
>>> parseStr('3HC1')
'3HC1'
>>> parseStr('12.e5')
1200000.0
>>> parseStr('12$5')
'12$5'
>>> parseStr('12.2.2')
'12.2.2'

tangzhulao

赞同来自:


这是一种值得在这里提到,AST literal_eval:

。可用于安全评估不需要解析值自己不被信任的来源包含Python表达式字符串。

是,安全“eval”
>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31

wenweijing

赞同来自:


YAML解析器可以帮助你找出你的字符串数据类型。使用YAML load()。然后你可以用类型(结果)测试类型:
>>> import yaml

>>> a = "545.2222"
>>> result = yaml.load(a)
>>> result
545.22220000000004
>>> type(result)
<type 'float'>

>>> b = "31"
>>> result = yaml.load(b)
>>> result
31
>>> type(result)
<type 'int'>

>>> c = "HI"
>>> result = yaml.load(c)
>>> result
'HI'
>>> type(result)
<type 'str'>

ccr1988

赞同来自:


如果你正在处理一个数字的字符串表示形式,你可能想考虑逗号的可能性(或其他区域特定的等价物)的数量。你可以使用的方法在现场转换成字符串数和照顾逗号同时。例如,该方法转换为浮动locale.atof一步:
>>> a = u'545,545.2222'
>>> import locale
>>> locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) 
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a) )
545545
>>> 

weicaijiang

赞同来自:


Python的方法检查如果字符串是浮动:
def isfloat(value):
try:
float(value)
return True
except ValueError:
return False


是什么,并不是Python的浮动可能会让你大吃一惊:
Command to parse                      isFloat?   Note
------------------------------------  --------   --------------------------------
print(isfloat(""))                    False      blankstring
print(isfloat("127"))                 True       passed string
print(isfloat(True))                  True       Pure sweet Truth
print(isfloat("True"))                False      Vile contemptible lie
print(isfloat(False))                 True       So false it becomes true
print(isfloat("123.456"))             True       Decimal
print(isfloat("      -127    "))      True       spaces trimmed
print(isfloat("\t\n12\r\n"))          True       whitespace ignored
print(isfloat("NaN"))                 True       Not a number
print(isfloat("NaNanananaBATMAN"))    False      I am Batman
print(isfloat("-iNF"))                True       Negative infinity
print(isfloat("123.E4"))              True       Exponential notation
print(isfloat(".1"))                  True       mantissa only 
print(isfloat("1,234"))               False      commas gtfo
print(isfloat(u'\x30'))               True       unicode is fine.
print(isfloat("NULL"))                False      null is not special
print(isfloat(0x3fade))               True       Hexidecimal
print(isfloat("6e7777777777777"))     True       Shrunk to infinity
print(isfloat("1.797693e+308"))       True       This is max value
print(isfloat("infinity"))            True       same as inf
print(isfloat("infinityandBEYOND"))   False      extra chars wreck it
print(isfloat("12.34.56"))            False      only one dot allowed
print(isfloat(u'四'))                 False      Japanese '4' is not a float.
print(isfloat("#56"))                 False      Pound sign
print(isfloat("56%"))                 False      Percent of what?
print(isfloat("0E0"))                 True       Exponential, move the dot 0 places
print(isfloat(0**0))                  True       0___0  Exponentiation
print(isfloat("-5e-5"))               True       Raise to a negative number
print(isfloat("+1e1"))                True       Plus is OK with exponent
print(isfloat("+1e1^5"))              False      Fancy exponent not interpreted
print(isfloat("+1e1.3"))              False      No decimals in exponent
print(isfloat("-+1"))                 False      Make up your mind
print(isfloat(chr(50)))               True       characters are ok
print(isfloat("(1)"))                 False      parenthesis bad

a761160025

赞同来自:


如果你不反对第三方模块,你可以查看fastnumbers模块。它提供了一个功能叫做fast_real,到底这个问题是要求,它比纯Python实现更快:
>>> from fastnumbers import fast_real
>>> fast_real("545.2222")
545.2222
>>> type(fast_real("545.2222"))
float
>>> fast_real("31")
31
>>> type(fast_real("31"))
int

要回复问题请先登录注册