17

所以我正在创建一个程序来显示数字系统,但是我在第一个障碍中遇到了问题。该程序将从用户那里获取一个数字,然后在整个程序中使用该数字来解释几个计算机科学概念。

在解释我的第一部分数字系统时,程序会说明它是什么类型的数字。我通过将字符串转换为浮点数来做到这一点。如果浮点数后面只有“.0”,则它将其转换为整数。

目前我正在使用此代码

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

这很有用,因为它显示用户是否输入了数字。但是我不确定现在如何检查小数点后的值以检查是否应该将其转换为整数。有小费吗?

4

8 回答 8

13

如果字符串可转换为整数,则它只能是数字。应该注意的是,正如@cwallenpoole 所说,这种方法不适用于负输入,因为“-”字符。你可以这样做:

if NumberString.isdigit():
    Number = int(NumberString)
else:
    Number = float(NumberString)

如果您已经将 Number 确认为浮点数,您可以随时使用is_integer(与底片一起使用):

if Number.is_integer():
    Number = int(Number)
于 2017-10-09T13:44:55.873 回答
6

这是检查的方法,

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"
于 2019-04-22T12:44:18.580 回答
5

不确定我是否遵循这个问题,但这是一个想法:

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
于 2017-10-09T13:41:32.373 回答
3

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

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.
于 2017-10-09T14:40:19.397 回答
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)```
于 2020-12-02T22:59:23.000 回答
0

正则表达式对此很好,因为它们可以定制,以防万一你有一些边缘情况。例如:

  • 你想如何处理填充数字(带前导零的数字)。我这里的例子包括了这个考虑。
  • 您是否需要处理指数,例如2.3E122.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"))

如果有任何警告、遗漏的细节或我可以做的正则表达式改进,请发表评论。

于 2021-10-31T21:54:44.800 回答
-1

这是我的要点,它不仅检查正负整数,还检查正负浮点数。它还检查字符串是否只是一个普通的非数字。

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() 存在一个问题,即它所谓的浮点数过于宽松。

于 2020-05-14T05:28:22.557 回答
-1

我将 bin Mohammed 的答案改写如下(数字也可能是负数):

from numpy import nan, isnan

def is_valid_number(s):
    if (s.find('-') <= 0) and s.replace('-', '', 1).isdigit():
        if (s.count('-') == 0):
            s_type = 'Positive Integer'
        else:
            s_type = 'Negative Integer'
    elif (s.find('-') <= 0) and (s.count('.') < 2) and \
         (s.replace('-', '', 1).replace('.', '', 1).isdigit()):
        if (s.count('-') == 0):
            s_type = 'Positive Float'
        else:
            s_type = 'Negative Float'
    else:
        s_type = "Not alphanumeric!"
    return('{}\t is {}'.format(s, s_type))

例子:

nums = ['12', '-34', '12.3', '-12.0', '123.0-02', '12!','5-6', '3.45.67']
for num in nums:
    print(is_valid_number(num))

结果:

12   is Positive Integer
-34  is Negative Integer
12.3     is Positive Float
-12.0    is Negative Float
123.0-02     is Not alphanumeric!
12!  is Not alphanumeric!
5-6  is Not alphanumeric!
3.45.67  is Not alphanumeric!

最少的代码:

from numpy import nan, isnan

def str2num(s):
    if (s.find('-') <= 0) and s.replace('-', '', 1).isdigit():
        return(int(s))
    elif (s.find('-') <= 0) and (s.count('.') < 2) and \
         (s.replace('-', '', 1).replace('.', '', 1).isdigit()):
        return(float(s))
    else:
        return(nan)

例子:

nums = ['12', '-34', '12.3', '-12.0', '123.0-02', '12!','5-6', '3.45.67']
for num in nums:
    x = str2num(num)
    if not isnan(x):
        print('x =', x) # .... or do something else

结果:

x = 12
x = -34
x = 12.3
x = -12.0
于 2022-02-27T10:56:06.107 回答