How do I parse a string to a float or int in Python?
在python中,如何将像
我只想知道如何将float
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 |
这个函数的长度和精度可以是:
什么是,也不是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) |
局部化
你应该考虑在一个号码的字符串代表中,例如
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.
你要求分开做这些很好。如果你把它们混在一起,以后你可能会遇到麻烦。简单的答案是:
1 2 | >>> float("545.2222") 545.2222 |
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 |
如果您事先不知道基,但您知道它们的前缀是正确的,那么如果您将
1 2 3 4 5 6 | >>> int("0b11111", 0) 31 >>> int('0o37', 0) 31 >>> int('0x1f', 0) 31 |
其他基数的非十进制(即整数)文本
但是,如果您的动机是让自己的代码清楚地表示硬编码的特定值,那么您可能不需要从基代码进行转换——您可以让Python使用正确的语法自动为您进行转换。
您可以使用apropos前缀自动转换为具有以下文本的整数。这些对python 2和3有效:
二进制,前缀
1 2 | >>> 0b11111 31 |
八进制,前缀
1 2 | >>> 0o37 31 |
十六进制,前缀
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 |
这很糟糕,因为它看起来应该是
1 2 3 4 5 | >>> 037 File"<stdin>", line 1 037 ^ SyntaxError: invalid token |
将python 2八进制转换为2和3中同时使用
1 2 | >>> 0o37 31 |
与EDOCX1&1
亚穆尔帕瑟可以帮助你输出你的数据类型。使用
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调用对象
这是正确的版本https://stackoverflow.com/a/33017514/5973334
这将尝试分析一个字符串,并根据该字符串所代表的内容返回
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 |
您可以使用
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 |
理论上,注射脆弱性。弦乐可以以