检查字符串是否为整数或浮点数

23

所以我正在创建一个程序来展示数字系统,然而我在第一关遇到了问题。程序将会从用户那里得到一个数字,之后将使用该数字贯穿整个程序以解释一些计算机科学概念。

在讲解第一个部分——数字系统时,程序将会告诉用户它是什么类型的数字。我通过将字符串转换为浮点数来实现这一点。如果浮点数只有'.0',则将其转换为整数。

目前,我正在使用以下代码:

while CorrectNumber == False:
try:
    Number = float(NumberString) - 0
    print (Number)
except:
    print ("Error! Not a number!")

这很有用,因为它可以显示用户是否输入了一个数字。然而,我不确定如何检查小数点后面的值,以决定是否应该将其转换为整数。有什么建议吗?


解决方案:https://stackoverflow.com/a/64132078/8321339 - Vishal Gupta
11个回答

21
如果字符串可以转换为整数,则它应该只包含数字。需要注意的是,正如@cwallenpoole所说,这种方法对于负输入不起作用,因为有'-'字符。您可以这样做:
如果该字符串可转化为整型,那么该字符串应该仅包含数字。需要注意的是,正如@cwallenpoole所述,由于存在“ - ”字符,此方法无法处理负输入。您可以尝试以下方法:
if NumberString.isdigit():
    Number = int(NumberString)
else:
    Number = float(NumberString)

如果您已经将 Number 确认为浮点数,您可以始终使用 is_integer(适用于负数):

if Number.is_integer():
    Number = int(Number)

4
不适用于负数。 - cwallenpoole
9
使用int(NumberString)(通过try处理ValueError异常)而不是使用.isdigit来检查一个字符串是否可以解析为整数。 - jacg

9
这里是检查的方法,请参考:
a = '10'
if a.isdigit():
   print "Yes it is Integer"
elif a.replace('.','',1).isdigit() and a.count('.') < 2:
   print "Its Float"
else:
   print "Its is Neither Integer Nor Float! Something else"

7

我不确定是否理解了问题,但是这里有一个想法:

test = ['1.1', '2.1', '3.0', '4', '5', '6.12']

for number in test:
    try:
        print(int(number))
    except ValueError:
        print(float(number))

返回:

1.1
2.1
3.0
4
5
6.12

6
请勿鼓励写except:而不指定异常类型,应该写成except ValueError: - jacg
1
这是更好的、更符合Python风格的方法。 - cwallenpoole
这是如何工作的?你能指出一些文档吗? - Savannah Madison
我不喜欢这种技术。你像这是程序正常执行一样玩弄try except。这很误导人。 - undefined

4

这将检查小数部分是否有任何非零数字。

def is_int(n):
    try:
        float_n = float(n)
        int_n = int(float_n)
    except ValueError:
        return False
    else:
        return float_n == int_n

def is_float(n):
    try:
        float_n = float(n)
    except ValueError:
        return False
    else:
        return True

测试函数:

nums = ['12', '12.3', '12.0', '123.002']

for num in nums:
    if is_int(num):
        print(num, 'can be safely converted to an integer.')
    elif is_float(num):
        print(num, 'is a float with non-zero digit(s) in the fractional-part.')

它会打印出:

12 can be safely converted to an integer.
12.3 is a float with non-zero digit(s) in the fractional-part.
12.0 can be safely converted to an integer.
123.002 is a float with non-zero digit(s) in the fractional-part.

1

正则表达式很适合这种情况,因为它们可以根据需要进行定制,以处理一些边缘情况。例如:

  • 你想如何处理带前导零的填充数字(即具有前导零的数字)。我的示例包括此考虑。
  • 你需要处理指数吗?比如: 2.3E12 或者 2.3e12。这里未予处理。

换句话说,如果你的实现与我的假设不符,你可以更改它。

正则表达式适用于所有版本的 Python (和其他语言)。可以编译以便重复利用,因此速度应该相当快。

# Int is:
#  - Only numbers that do NOT start with 0 (protect padded number strings)
#  - Exactly 0
re_int = re.compile(r"(^[1-9]+\d*$|^0$)")

# Float is:
#  - Only numbers but with exactly 1 dot.
#  - The dot must always be followed number numbers
re_float = re.compile(r"(^\d+\.\d+$|^\.\d+$)")

这些测试都通过了:

def test_re_int(self):
    self.assertTrue(re_int.match("1"))
    self.assertTrue(re_int.match("1543"))
    self.assertTrue(re_int.match("0"))  # Exactly 0 is good

    self.assertFalse(re_int.match("1.54"))
    self.assertFalse(re_int.match("1a4"))
    self.assertFalse(re_int.match("14a"))
    self.assertFalse(re_int.match("a14"))
    self.assertFalse(re_int.match("00"))  # Ambiguous
    self.assertFalse(re_int.match("0012"))  # Protect padding

def test_re_float(self):

    self.assertTrue(re_float.match("1.0"))
    self.assertTrue(re_float.match("1.456"))
    self.assertTrue(re_float.match("567.456"))
    self.assertTrue(re_float.match("0.10"))
    self.assertTrue(re_float.match(".10"))

    self.assertFalse(re_float.match("1.0.0"))  # Too many dots
    self.assertFalse(re_float.match(".10.0"))
    self.assertFalse(re_float.match("..034"))

    self.assertFalse(re_float.match("1"))
    self.assertFalse(re_float.match("0"))
    self.assertFalse(re_float.match("1a4"))
    self.assertFalse(re_float.match("14a"))
    self.assertFalse(re_float.match("a14"))

    self.assertFalse(re_float.match("1.a4"))
    self.assertFalse(re_float.match("1.4a"))
    self.assertFalse(re_float.match(".a14"))

如果有任何注意事项、缺失的细节或正则表达式改进之处,请评论。


它不能处理负值。如果可能的话,请更新。 - Parag Meshram

1
然而,我不确定如何在小数点后面检查值,以确定是否应该将其转换为整数。
令人惊讶的是,似乎每个人都忽略了这是一个取模问题。
a = "3.0"
x = float(a)
if x % 1 == 0:
    print("It's an integer.")

至少,那是我认为你的意思。

1
简单的函数,考虑了大多数情况:
def checking(val):
    if type(val) == bool:
        return 'bool'
    dType = 'str'
    try:
        float(val)         
        dType = 'float'    
        if str(int(val)) == str(val):          
            dType = 'int'      
    except:                     
        pass
    return (dType)        
 

测试

for item in [0, 1,'1',-1,'-1',True, False, 'True','False', 'string', 0.0,'0.0',1.0, '1.0',1.3, '1.3',-1.3, '-1.3','2.3E12','-2.3E12']:
    print (item,': ', checking(item)) 

打印输出:
    0 :  int
    1 :  int
    1 :  int
   -1 :  int
   -1 :  int
   True :  bool
   False :  bool
   True :  str
   False :  str
   string :  str
   0.0 :  float
   0.0 :  float
   1.0 :  float
   1.0 :  float
   1.3 :  float
   1.3 :  float
   -1.3 :  float
   -1.3 :  float
   2.3E12 :  float
  -2.3E12 :  float

检查函数的逻辑很简单。如果一个字符串确实是非数字(不是浮点数或整数),那么它无法转换为浮点数,会抛出异常并返回'str'。如果它是数字,则默认可以转换为浮点数。一旦转换为浮点数,我们需要检查这个数字是否是真正的整数。因此,我们通过将其转换为字符串来比较其字符串表示,以确定它是否是真正的整数。

0

这是我的代码片段,它不仅检查正整数和负整数,还检查正浮点数和负浮点数。它还检查字符串是否只是普通的非数字字符。

def int_float_or_string(string):
    try:
        int(string)  # strict and nice
    except ValueError:
        if is_strictly_float(string): # float() is too permissive, this is better
            return "float"
        else:
            return "string"
    else:
        return "int"

def is_strictly_float(string):
    if string.startswith("-"):
        string = string[1:]
    return "." in string and string.replace(".", "", 1).isdecimal()

int() 用于检查整数,但 float() 在判断浮点数时有 太随意的问题


0
x=input("Enter a value to check it's  type: ")
def checknumber(a):
    try:
        a=float(a)
        if int(a)/a==1:
            print("This is Integer")
            return a
        elif a/int(a)>1:
            print("This is Float")
            return a
    except ValueError:
        print("This value is String")
        return str(a)
x=checknumber(x)```

这样仅包含代码的回答通常会在这里遭到贬低。请编辑你的回答并解释你所做的更改,或者如何运作等内容。 - Arthur Pereira

0

有点晚了,但是每当我必须检查一个字符串中是否有intfloat数字/数值时,我都会使用这种方法。

import re

def float_or_int_checker(el: str) -> bool:
    pattern = r'^[-+]?(\d+(\.\d*)?|\.\d+)$'
    if re.match(pattern, el):
        return True
    return False


l = ['3.14', '9', '', ' ', 3.14, 9, '3.14f', 'g9']
for i in l:
    print(float_or_int_checker(str(i)))
#output:
3.14: True
9: True
: False
: False
3.14: True
9: True
3.14f: False
g9: False

正则表达式模式查找: ^[-+]? -> 检查字符串是否以减号或加号开头。"?" 使此匹配可选。 \d+(\.\d*)? -> 检查一个或多个数字,点 "." 后面的任意数字也是可选的。 \.\d+ -> 确保如果有小数点,后面至少跟着一个数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接