将stringparsing为Float或Int

在Python中,我怎样才能parsing一个数字string像"545.2222"到它相应的浮点值542.2222 ? 或者将string"31"parsing为一个整数31

我只想知道如何将一个浮点 stringparsing为一个float ,然后(单独)将一个int stringparsing为一个int

 >>> a = "545.2222" >>> float(a) 545.22220000000004 >>> int(float(a)) 545 
 def num(s): try: return int(s) except ValueError: return float(s) 

检查一个string是否为float的Python方法:

 def isfloat(value): try: float(value) return True except: return False 

这个函数的名字越长越准确: isConvertibleToFloat(value)

什么是,而不是在Python中浮动可能会让你感到惊讶:

 val isfloat(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\n12\r\n" 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 Hexidecimal "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 

你以为你知道什么是数字? 你不像你想的那么好! 不是很大的惊喜。

这是值得在这里提到的另一种方法, ast.literal_eval :

这可以用来从不受信任的来源安全地计算包含Pythonexpression式的string,而不需要自己parsing这些值。

也就是说,一个安全的“评估”

 >>> import ast >>> ast.literal_eval("545.2222") 545.2222 >>> ast.literal_eval("31") 31 
 float(x) if '.' in x else int(x) 

本地化和逗号

你应该考虑在一个数字的string表示forms逗号的可能性,像float("545,545.2222")引发exception的情况。 相反,使用locale方法将string转换为数字并正确解释逗号。 locale.atof方法一旦将语言环境设置为所需的数字约定,就会一步转换为浮点数。

例1 – 美国的数字约定

在美国和英国,逗号可以用作千位分隔符。 在美国语言环境的这个例子中,逗号作为分隔符被正确处理:

 >>> 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 >>> 

例2 – 欧洲数字惯例

在世界大多数国家中 ,逗号用于十进制而不是句号。 在这个使用法语区域设置的例子中,逗号被正确处理为小数点:

 >>> import locale >>> b = u'545,2222' >>> locale.setlocale(locale.LC_ALL, 'fr_FR') 'fr_FR' >>> locale.atof(b) 545.2222 

方法locale.atoi也是可用的,但参数应该是一个整数。

用户codelogicharley是正确的,但要记住,如果你知道string是一个整数(例如545),你可以调用int(“545”),而不需要首先强制浮动。

如果你的string在列表中,你也可以使用map函数。

 >>> x = ["545.0", "545.6", "999.2"] >>> map(float, x) [545.0, 545.60000000000002, 999.20000000000005] >>> 

只有它们都是相同的types才是好的。

如果您不反对第三方模块,则可以检出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 

这个问题似乎有点老了。 但让我build议一个函数,parseStr,它使类似的东西,即返回整数或浮点数,如果一个给定的ASCIIstring不能转换为任何一个,它不会返回它。 代码当然可以调整,只做你想要的:

  >>> 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' 

在Python中,我怎样才能parsing一个数字string像“545.2222”到它相应的浮点值542.2222? 或者将string“31”parsing为一个整数31? 我只想知道如何将一个浮点stringparsing为一个浮点数,然后(单独)将一个intstringparsing为一个int。

你要求分开做这个很好。 如果你把它们混合在一起,你可能会在以后自行解决问题。 简单的答案是:

"545.2222"浮动:

 >>> float("545.2222") 545.2222 

"31"为整数:

 >>> int("31") 31 

其他转换,整数和string和文字:

来自不同基地的转化,你应该提前知道基地(10是默认的)。 请注意,你可以用Python的字面值(见下面)或者删除前缀来给它们加上前缀:

 >>> 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可以为你推断这个:

 >>> int("0b11111", 0) 31 >>> int('0o37', 0) 31 >>> int('0x1f', 0) 31 

非小数(即整数)文字从其他基地

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

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

二进制,前缀0b

 >>> 0b11111 31 

八进制,前缀0o

 >>> 0o37 31 

hex,前缀0x

 >>> 0x1f 31 

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

 >>> 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兼容

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

 >>> 037 31 

这是不好的,因为它看起来应该是37的值。 所以在Python 3中,它现在引发了一个SyntaxError

 >>> 037 File "<stdin>", line 1 037 ^ SyntaxError: invalid token 

将您的Python 2八进制数转换为使用0o前缀在2和3中工作的八进制数:

 >>> 0o37 31 

float("545.2222")int(float("545.2222"))

YAMLparsing器可以帮助你找出你的string是什么数据types。 使用yaml.load() ,然后你可以使用type(result)来testingtype:

 >>> 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'> 
 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 

你需要考虑到四舍五入正确做到这一点。

即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) 
 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') 

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

这将尝试parsing一个string,并根据string表示的内容返回intfloat 。 它可能会增加parsingexception或者有一些意想不到的行为 。

  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 

使用:

 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的方式。

我使用这个function

 def parse_str(s): try: return eval(str(s)) except: return 

它会将string转换为它的types

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

我很惊讶,没有人提到正则expression式,因为有时string必须准备和规范化之前铸造编号

 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 

用法:

 parseNumber('13,345') > 13345.0 parseNumber('- 123 000') > -123000.0 parseNumber('99999\n') > 99999.0 

顺便说一句,validation你有一个数字:

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

使用:

 >>> 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'> 

这是对你的问题的另一种解释(提示:这是模糊的)。 有可能你正在寻找这样的东西:

 def parseIntOrFloat( aString ): return eval( aString ) 

它是这样的…

 >>> parseIntOrFloat("545.2222") 545.22220000000004 >>> parseIntOrFloat("545") 545 

理论上讲,存在注入漏洞。 string可以,例如"import os; os.abort()" 。 然而,没有任何关于弦线来自何处的背景,这种可能性是理论上的猜测。 由于这个问题是模糊的,这个漏洞是否真的存在还不是很清楚。