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
>>> 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'
457
使用:
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()
这是我能想出的最恐怖的方式 .
7
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')
>>> 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
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\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 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
你认为你知道什么数字?你没有想象的那么好!不是很大的惊喜 .
4
使用:
>>> 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'>
24 回答
我使用这个功能
它会将字符串转换为其类型
我很惊讶没有人提到正则表达式,因为有时字符串必须在转换为数字之前准备并规范化
用法:
顺便说一句,要验证你有一个数字:
这是对你的问题的另一种解释(提示:它含糊不清) . 你可能正在寻找这样的东西:
它像这样工作......
从理论上讲,存在注射漏洞 . 例如,字符串可以是
"import os; os.abort()"
. 然而,没有关于字符串来自何处的任何背景,可能性是理论推测 . 由于问题含糊不清,如果这个漏洞确实存在与否,则一点也不清楚 .float("545.2222")
和int(float("545.2222"))
YAML解析器可以帮助您确定字符串的数据类型 . 使用
yaml.load()
,然后您可以使用type(result)
来测试类型:这个问题似乎有点老了 . 但是,让我建议一个函数,parseStr,它使类似的东西,即返回整数或浮点数,如果给定的ASCII字符串不能转换为它们中的任何一个,它返回它不受影响 . 当然代码可以调整为只做你想要的:
使用:
这是我能想出的最恐怖的方式 .
如果您不反对第三方模块,可以查看fastnumbers模块 . 它提供了一个名为fast_real的函数,它完全符合这个问题的要求,并且比纯Python实现更快:
用户codelogic和harley是正确的,但请记住,如果你知道字符串是一个整数(例如,545),你可以调用int("545")而不首先转换为float .
如果您的字符串在列表中,您也可以使用map函数 .
如果它们都是相同的类型,那就好了 .
你要求分别做这些是很好的 . 如果你正在混合它们,你可能会在以后为自己设置问题 . 简单的答案是:
"545.2222" to float:
"31" to an integer:
其他转换,来往于字符串和文字的内容:
各种基础的转换,你应该提前知道基数(默认为10) . 请注意,您可以使用Python期望的文字前缀(参见下文)或删除前缀:
如果您事先不知道基数,但是您知道它们将具有正确的前缀,那么如果您将
0
作为基数传递,Python可以为您推断:来自其他基础的非十进制(即整数)文字
如果您的动机是让您自己的代码清楚地表示硬编码的特定值,那么您可能不需要从基础转换 - 您可以让Python使用正确的语法自动执行此操作 .
您可以使用apropos前缀自动转换为the following literals的整数 . 这些对Python 2和3有效:
二进制,前缀
0b
八进制,前缀
0o
十六进制,前缀
0x
这在描述二进制标志,代码中的文件权限或颜色的十六进制值时非常有用 - 例如,请注意没有引号:
使Python 2的octals与Python 3兼容
如果你看到一个以0开头的整数,在Python 2中,这是(不推荐的)八进制语法 .
这很糟糕,因为它看起来应该是
37
. 所以在Python 3中,它现在引发了一个SyntaxError
:使用
0o
前缀将Python 2八进制转换为在2和3中都有效的八进制:这是另一种值得在此提及的方法,ast.literal_eval:
也就是说,安全'评估'
本地化和逗号
对于像
float("545,545.2222")
这样抛出异常的情况,你应该考虑数字的字符串表示中逗号的可能性 . 相反,使用locale
中的方法将字符串转换为数字并正确解释逗号 . 一旦为所需的数字约定设置了语言环境,locale.atof
方法就会在一个步骤中转换为浮点数 .Example 1 -- United States number conventions
在里面美国和英国的逗号可以用作千位分隔符 . 在使用美国语言环境的此示例中,逗号作为分隔符正确处理:
Example 2 -- European number conventions
在majority of countries of the world中,逗号用于十进制标记而不是句点 . 在此示例中使用法语区域设置,逗号可以正确处理为小数点:
方法
locale.atoi
也可用,但参数应该是整数 .您需要考虑舍入才能正确执行此操作 .
即int(5.1)=> 5 int(5.6)=> 5 - 错误,应为6所以我们做int(5.6 0.5)=> 6
Python在一个内核中具有很大的解析灵活性 .
要在python中进行类型转换,请使用该类型的构造函数,将字符串(或您尝试转换的任何值)作为参数传递 .
例如:
在幕后,python正在调用对象
__float__
方法,该方法应该返回参数的浮点表示 . 这是特别强大的,因为您可以使用__float__
方法定义自己的类型(使用类),以便可以使用float(myobject)将其转换为float .This is a corrected version of https://stackoverflow.com/a/33017514/5973334
这将尝试解析字符串并返回
int
或float
,具体取决于字符串表示的内容 . 它可能会上升解析异常或have some unexpected behaviour .您可以使用
str()
将任何变量转换为字符串,int()
将字符串整数转换为整数,使用float()
将字符串浮点数转换为浮点值 .用于检查字符串是否为float的Python方法:
此函数的更长更准确的名称可能是:
is_convertible_to_float(value)
什么是,而不是Python中的浮点数可能会让你感到惊讶:
你认为你知道什么数字?你没有想象的那么好!不是很大的惊喜 .
使用: