关于解析:如何在python中将字符串解析为float或int?

How do I parse a string to a float or int in Python?

在python中,如何将像"545.2222"这样的数字字符串解析为其相应的浮点值545.2222?或者将字符串"31"解析为整数31

我只想知道如何将float str解析为float,以及(分别)int str解析为int


1
2
3
4
5
>>> a ="545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545


1
2
3
4
5
def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)


Python method to check if a string is a float:

1
2
3
4
5
6
def is_float(value):
  try:
    float(value)
    return True
  except:
    return False

这个函数的长度和精度可以是:is_convertible_to_float(value)

什么是,也不是Python中的一个浮动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
val                   is_float(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127   "      True         Spaces trimmed
"\t
12

"
         True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u'四'                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

你知道号码是什么吗?你不太好!不是大惊喜


This is another method which deserves to be mentioned here,ast.literal&u eval:

This can be used for safely evaluating strings containing Python expressions from untrusted sources without the need to parse the values oneself.

这是一个安全的伊凡

1
2
3
4
5
>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31


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


局部化

你应该考虑在一个号码的字符串代表中,例如float("545,545.2222")的可能性,因为这是一个例外。将弦转换成正确的数字和解释符号。方法转换成一步一步的浮动,直到当地制定了一项有望的公约。

Example 1-United States Number Conventions

在美国和联合王国,可以作为一个分离器使用。In this example with American local,the Comma is handled properly as a separator:

1
2
3
4
5
6
7
8
9
>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

Example 2-European number conventions

在世界上大多数国家,用以判定一个时期内的马尔卡。In this example with French Local,the Comma is right handled as a decimal mark:

1
2
3
4
5
6
>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

该方法也可用,但论据应该是一个整体。


用户密码和哈雷是正确的,但如果你知道弦乐是一个整数(例如545),你可以不首先铸造流量。

如果你的弦乐在列表中,你可以使用图表功能。

ZZU1

如果他们都是同一个人,那就好了


如果你不下雨到第三个派对模块,你可以检查一下时尚模块。It provides a function called fast real that does exactly what this question is asking for for and does it faster than a pure-python implementation:

1
2
3
4
5
6
7
8
9
>>> 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

这个问题看起来有点老。但让我提出一个功能,Parsestr,它使一些相似的功能,即,返回的积分或浮动,如果一个Given ASCII字符串不能被转换成任何一个它没有触摸。The code of course might be adjusted to do only what you want:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   >>> 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'


In Python, how can I parse a numeric string like"545.2222" to its corresponding float value, 542.2222? Or parse the string"31" to an integer, 31?
I just want to know how to parse a float string to a float, and (separately) an int string to an int.

你要求分开做这些很好。如果你把它们混在一起,以后你可能会遇到麻烦。简单的答案是:

"545.2222"浮动:

1
2
>>> float("545.2222")
545.2222

"31"变为整数:

1
2
>>> int("31")
31

其他转换、与字符串和文字之间的整数:

转换不同的基,您应该提前知道基(默认为10)。注意,您可以为它们加上python对其文本期望的前缀(见下文),或者删除前缀:

1
2
3
4
5
6
7
8
9
10
11
12
>>> int("0b11111", 2)
31
>>> int("11111", 2)
31
>>> int('0o37', 8)
31
>>> int('37', 8)
31
>>> int('0x1f', 16)
31
>>> int('1f', 16)
31

如果您事先不知道基,但您知道它们的前缀是正确的,那么如果您将0作为基传递,python可以为您推断:

1
2
3
4
5
6
>>> int("0b11111", 0)
31
>>> int('0o37', 0)
31
>>> int('0x1f', 0)
31

其他基数的非十进制(即整数)文本

但是,如果您的动机是让自己的代码清楚地表示硬编码的特定值,那么您可能不需要从基代码进行转换——您可以让Python使用正确的语法自动为您进行转换。

您可以使用apropos前缀自动转换为具有以下文本的整数。这些对python 2和3有效:

二进制,前缀0b

1
2
>>> 0b11111
31

八进制,前缀0o

1
2
>>> 0o37
31

十六进制,前缀0x

1
2
>>> 0x1f
31

这在描述二进制标志、代码中的文件权限或颜色的十六进制值时非常有用,例如,请注意不要引号:

1
2
3
4
5
6
>>> 0b10101 # binary flags
21
>>> 0o755 # read, write, execute perms for owner, read & ex for group & others
493
>>> 0xffffff # the color, white, max values for red, green, and blue
16777215

使模糊的python 2八进制与python 3兼容

如果您看到一个以0开头的整数,在python 2中,这是(不推荐使用)八进制语法。

1
2
>>> 037
31

这很糟糕,因为它看起来应该是37。所以在python 3中,它现在提出了一个SyntaxError

1
2
3
4
5
>>> 037
  File"<stdin>", line 1
    037
      ^
SyntaxError: invalid token

将python 2八进制转换为2和3中同时使用0o前缀的八进制:

1
2
>>> 0o37
31

与EDOCX1&1


亚穆尔帕瑟可以帮助你输出你的数据类型。使用yaml.load(),然后你可以使用type(result)测试类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> 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'>

我用这个函数

1
2
3
4
5
6
7
import ast

def parse_str(s):
   try:
      return ast.literal_eval(str(s))
   except:
      return

它将把字符串转换成它的类型

1
2
value = parse_str('1')  # Returns Integer
value = parse_str('1.5')  # Returns Float

1
2
3
4
def get_int_or_float(v):
    number_as_float = float(v)
    number_as_int = int(number_as_float)
    return number_as_int if number_as_float == number_as_int else number_as_float


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def num(s):
"""num(s)
num(3),num(3.7)-->3
num('3')-->3, num('3.7')-->3.7
num('3,700')-->ValueError
num('3a'),num('a3'),-->ValueError
num('3e4') --> 30000.0
"""

try:
    return int(s)
except ValueError:
    try:
        return float(s)
    except ValueError:
        raise ValueError('argument is not a string of number')

你需要先到帐户开着,这样就行了。

I.E.INT(5.1)=>5Int(5.6)=>5-wrong,should be 6 so we do int(5.6+0.5)=>6

1
2
3
4
5
def convert(n):
    try:
        return int(n)
    except ValueError:
        return float(n + 0.5)


我很惊讶没有人提到regex,因为有时字符串必须在转换为数字之前准备好并规范化。

1
2
3
4
5
6
7
8
9
10
import re
def parseNumber(value, as_int=False):
    try:
        number = float(re.sub('[^.\-\d]', '', value))
        if as_int:
            return int(number + 0.5)
        else:
            return number
    except ValueError:
        return float('nan')  # or None if you wish

用途:

1
2
3
4
5
6
7
8
9
parseNumber('13,345')
> 13345.0

parseNumber('- 123 000')
> -123000.0

parseNumber('99999
'
)
> 99999.0

顺便说一下,要验证一下你有一个数字:

1
2
3
4
import numbers
def is_number(value):
    return isinstance(value, numbers.Number)
    # will work with int, float, long, Decimal

Python在一行程序中具有很强的解析灵活性。

1
2
3
str ="545.2222"
print ("int:", + int(float(a)))
print ("float:", +(float(a)))

要在python中进行类型转换,请使用类型的构造函数函数,将字符串(或您尝试转换的任何值)作为参数传递。

例如:

1
2
>>>float("23.333")
   23.333

在幕后,python调用对象__float__方法,该方法将返回参数的浮点表示。这特别强大,因为您可以使用__float__方法定义自己的类型(使用类),以便使用float(myObject)将其强制转换为float。


这是正确的版本https://stackoverflow.com/a/33017514/5973334

这将尝试分析一个字符串,并根据该字符串所代表的内容返回intfloat。它可能会增加解析异常或有一些意外的行为。

1
2
3
4
5
  def get_int_or_float(v):
        number_as_float = float(v)
        number_as_int = int(number_as_float)
        return number_as_int if number_as_float == number_as_int else
        number_as_float

您可以使用str()将任何变量转换为字符串,int()将字符串整数转换为整数,float()将字符串浮点数转换为浮点值。

1
2
str_to_float = float("545.2222")
str_to_int = int("31")

用途:

1
2
3
4
5
6
7
8
9
def num(s):
    try:
        for each in s:
            yield int(each)
    except ValueError:
        yield float(each)
a = num(["123.55","345","44"])
print a.next()
print a.next()

这是我能想到的最Python的方法。


如果知道str,它可以是int或float:

1
return int(s) if s.isdigit() else float(s)


用途:

1
2
3
4
5
6
7
8
9
10
11
>>> str_float ="545.2222"
>>> float(str_float)
545.2222
>>> type(_) # Check its type
<type 'float'>

>>> str_int ="31"
>>> int(str_int)
31
>>> type(_) # Check its type
<type 'int'>


这是对你问题的另一种解释(Hint:这是模糊的)。你可能在找像这样的东西

1
2
def parseIntOrFloat( aString ):
    return eval( aString )

它就像这样工作

1
2
3
4
>>> parseIntOrFloat("545.2222")
545.22220000000004
>>> parseIntOrFloat("545")
545

理论上,注射脆弱性。弦乐可以以"import os; os.abort()"为例。没有任何背景,弦乐从哪里来,但可能性是理论上的模型。既然这个问题很模糊,那么,如果这种脆弱性实际存在或不存在,这一点就不清楚。