ตรวจสอบว่าตัวเลขเป็น int หรือลอย


199

นี่คือวิธีที่ฉันทำ:

inNumber = somenumber
inNumberint = int(inNumber)
if inNumber == inNumberint:
    print "this number is an int"
else:
    print "this number is a float"

อะไรแบบนั้น.
มีวิธีที่ดีกว่าในการทำเช่นนี้?


4
เคล็ดลับคือการค้นหา SO ทุกครั้งที่คำถามนี้ถูกถาม แต่ละคนจะให้คำตอบที่เหมือนกันและซ้ำกัน
S.Lott

1
... และทำไมคุณต้องรู้
Karl Knechtel


@Wooble: มันล้มเหลวในจำนวนที่มากขึ้น
jfs

assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)เป็นสิ่งที่ฉันกำลังมองหาเมื่อฉันพบคำถามนี้กับ Google
Martin Thoma

คำตอบ:


283

ใช้isinstance

>>> x = 12
>>> isinstance(x, int)
True
>>> y = 12.0
>>> isinstance(y, float)
True

ดังนั้น:

>>> if isinstance(x, int):
        print 'x is a int!'

x is a int!

_EDIT: _

ตามที่ระบุไว้ในกรณีที่เป็นจำนวนเต็มยาวด้านบนจะไม่ทำงาน ดังนั้นคุณต้องทำ:

>>> x = 12L
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x, int)
False

จะไม่issubclassเป็นเรื่องทั่วไปมากขึ้น?
David Heffernan

3
@David: issubclassจะเป็นข้อผิดพลาดเนื่องจากทำงานได้กับคลาส isinstanceตรวจสอบว่าวัตถุที่กำหนดเป็นตัวอย่างของคลาสหรือหนึ่งในคลาสย่อยของคลาสนั้นหรือไม่ดังนั้นจึงเป็นเรื่องทั่วไปอย่างสมบูรณ์ Methinks ที่isinstance(obj, cls)เทียบเท่ากับissubclass(obj.__class__, cls)

7
นี้ไม่ได้ทำงานชนิดจำนวนเต็มอื่น ๆ x = 12Lเช่นถ้า ฉันรู้ว่าintถูกขอเท่านั้น แต่มันก็ดีที่จะแก้ไขปัญหาอื่น ๆ ก่อนที่จะเกิดขึ้น isinstance(x, numbers.Integral)ทั่วไปมากที่สุดน่าจะเป็น
Scott Griffiths

9
สำหรับงูหลาม 2 isinstance(x, (int, long))นอกจากนี้ยังมีการตรวจสอบคู่โดยตรง:
Eric O Lebigot

1
คำเตือน: bools เป็นอินสแตนซ์ของจำนวนเต็มด้วย ดูisinstance(True, int)
jtschoonhoven

93

ฉันชอบ @ ninjagecko มากที่สุด

สิ่งนี้จะได้ผล:

สำหรับ Python 2.x

isinstance(n, (int, long, float)) 

Python 3.x มีความยาวไม่มาก

isinstance(n, (int, float))

นอกจากนี้ยังมีประเภทที่ซับซ้อนสำหรับจำนวนเชิงซ้อน


sidenote เนื่องจาก booleans จะแก้ไขเป็น True (เช่นisinstance(False, (int, float)) = True) ฉันต้องการnot isinstance(n, bool) and isinstance(n, (int, float))แทน
YTZ

54

หนึ่งในสายการบิน:

isinstance(yourNumber, numbers.Real)

วิธีนี้หลีกเลี่ยงปัญหา:

>>> isinstance(99**10,int)
False

การสาธิต:

>>> import numbers

>>> someInt = 10
>>> someLongInt = 100000L
>>> someFloat = 0.5

>>> isinstance(someInt, numbers.Real)
True
>>> isinstance(someLongInt, numbers.Real)
True
>>> isinstance(someFloat, numbers.Real)
True

6
ในหลาม 3 คือisinstance(99**10,int) True
Carlos A. Gómez

12

การให้อภัยง่ายกว่าการขออนุญาต เพียงดำเนินการ หากใช้งานได้วัตถุนั้นจะเป็นชนิดที่ยอมรับได้เหมาะสมและเหมาะสม หากการดำเนินการไม่ทำงานวัตถุนั้นไม่ใช่ชนิดที่เหมาะสม รู้ชนิดไม่ค่อยช่วย

ลองใช้งานและดูว่าใช้งานได้หรือไม่

inNumber = somenumber
try:
    inNumberint = int(inNumber)
    print "this number is an int"
except ValueError:
    pass
try:
    inNumberfloat = float(inNumber)
    print "this number is a float"
except ValueError:
    pass

5
มีเหตุผลที่จะทำเช่นนี้เมื่อใดtypeและisinstanceสามารถทำงานได้หรือไม่
user225312

9
int (1.5) ไม่ยก ValueError และเห็นได้ชัดว่าคุณให้คำตอบที่ผิดกับวัตถุประสงค์ อย่างจริงจัง?
Glenn Maynard

4
@ Glenn: ฉันถือว่า S.Lott เข้าใจคำถามว่า "ตรวจสอบว่าสตริงเป็น int หรือลอย" (ซึ่งในกรณีนี้มันจะเป็นทางออกที่ดีจริงๆ)

class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int@AA: (ขออภัยสำหรับไวยากรณ์ที่ไม่ดี แต่ฉันไม่สามารถทำได้มากกว่าหนึ่งบรรทัด)
mg

2
@AA: ใช่ เหตุผลก็คือสิ่งนี้ง่ายกว่าและเชื่อถือได้มากกว่า ความแตกต่างระหว่างintและfloatอาจไม่เกี่ยวข้องกับอัลกอริทึมมากมาย การขอประเภทอย่างชัดเจนมักเป็นสัญญาณของความแตกต่างที่ไม่ดีหรือปัญหาการออกแบบที่รุนแรงยิ่งขึ้น ในระยะสั้น อย่าตรวจสอบประเภท มันง่ายกว่าที่จะถามการให้อภัยมากกว่าขออนุญาต
S.Lott

10

คุณสามารถทำได้ด้วยการใช้type() ตัวอย่าง:

if type(inNumber) == int : print "This number is an int"
elif type(inNumber) == float : print "This number is a float"

1
สิ่งนี้จะล้มเหลวในกรณี [หายากที่ยอมรับได้] ว่าจำนวนที่เป็นปัญหานั้นเป็น SUBCLASS ของ int หรือ float (ดังนั้นทำไม "isinstance" จึงถูกพิจารณาว่า "ดีกว่า" IMO)
Dan H

7

นี่คือส่วนหนึ่งของรหัสที่ตรวจสอบว่าตัวเลขเป็นจำนวนเต็มหรือไม่มันใช้ได้กับทั้ง Python 2 และ Python 3

import sys

if sys.version < '3':
    integer_types = (int, long,)
else:
    integer_types = (int,)

isinstance(yourNumber, integer_types)  # returns True if it's an integer
isinstance(yourNumber, float)  # returns True if it's a float

ขอให้สังเกตว่างูหลาม 2 มีทั้งสองชนิดintและlongในขณะที่งูใหญ่ 3 intมีเพียงประเภทเดียว แหล่ง

หากคุณต้องการตรวจสอบว่าหมายเลขของคุณเป็นหมายเลขfloatนั้นหรือintไม่ให้ทำเช่นนี้

(isinstance(yourNumber, float) and (yourNumber).is_integer())  # True for 3.0

หากคุณไม่จำเป็นต้องแยกแยะความแตกต่างระหว่าง int และ float และใช้ได้กับทั้งคู่คำตอบของ ninjagecko คือหนทางที่จะไป

import numbers

isinstance(yourNumber, numbers.Real)


6

ฉันรู้ว่ามันเป็นเธรดเก่า แต่นี่เป็นสิ่งที่ฉันใช้และฉันคิดว่ามันอาจช่วยได้

มันทำงานได้ใน python 2.7 และ python 3 <

def is_float(num):
    """
    Checks whether a number is float or integer

    Args:
        num(float or int): The number to check

    Returns:
        True if the number is float
    """
    return not (float(num)).is_integer()


class TestIsFloat(unittest.TestCase):
    def test_float(self):
        self.assertTrue(is_float(2.2))

    def test_int(self):
        self.assertFalse(is_float(2))

5

คุณสามารถใช้โมดูโลเพื่อตรวจสอบว่า x เป็นจำนวนเต็มเป็นตัวเลขหรือไม่ isinstance(x, int)วิธีเดียวที่กำหนดว่า x เป็นจำนวนเต็มประเภท:

def isInt(x):
    if x%1 == 0:
        print "X is an integer"
    else:
        print "X is not an integer"

3.2 % 21.4อัตราผลตอบแทน การแข่งขันของ Whatchu talkin 'Willi (s | am)? นอกจากนี้คุณยังจะได้รับTypeErrorถ้า x เป็นตัวเลขที่ไม่เริ่มต้นด้วยเพื่อให้โปรแกรมของคุณจะออกก่อนกำหนดถ้าคุณทำตามคำแนะนำนี้ ...
dylnmc

@dylnmc จากนั้นคุณสามารถใช้ isinstance () วิธีการตรวจสอบว่า x เป็นจำนวน นอกจากนี้ 3.2% 1 ให้ผลตอบแทน 0.2 หากตัวเลขหารด้วย 1 อย่างสม่ำเสมอจะเป็นจำนวนเต็ม วิธีนี้มีประโยชน์สำหรับฉันแม้ว่ามันอาจจะไม่เหมาะกับคุณก็ตาม
William Gerecke

นี่เป็นเรื่องจริง x%1 == 0ควรเป็นจริงสำหรับ ints เท่านั้น (แต่จะเป็นจริงสำหรับโฟลตที่มีจุดทศนิยมตามศูนย์) ถ้าคุณรู้ว่ามันจะเป็น int (เช่นถ้านี่เป็นพารามิเตอร์ของฟังก์ชัน) คุณก็สามารถตรวจสอบกับโมดูโลได้ Math.floor(x) == xฉันเดิมพันที่จะเร็วกว่า ในด้านที่ไม่ให้แสงสว่างนี่จะเป็นTrueถ้าคุณผ่านโฟลตเช่น1.0หรือ5.0และคุณจะพบปัญหาเดียวกันโดยใช้สิ่งที่โปสเตอร์ต้นฉบับกล่าวถึงในคำถามของเขา / เธอ
dylnmc

5

พยายามใน Python เวอร์ชั่น 3.6.3 Shell

>>> x = 12
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x,int)
True

ไม่สามารถคิดออกว่าจะทำงานเพื่ออะไร


4

กรุณาตรวจสอบสิ่งนี้: นำเข้าหมายเลข

import math

a = 1.1 - 0.1
print a 

print isinstance(a, numbers.Integral)
print math.floor( a )
if (math.floor( a ) == a):
    print "It is an integer number"
else:
    print False

แม้ว่า X จะลอย แต่ค่าเป็นจำนวนเต็มดังนั้นถ้าคุณต้องการตรวจสอบค่าเป็นจำนวนเต็มคุณไม่สามารถใช้ isinstance และคุณต้องเปรียบเทียบค่าที่ไม่ใช่ประเภท



0

อัปเดต: ลองนี้


inNumber = [32, 12.5, 'e', 82, 52, 92, '1224.5', '12,53',
            10000.000, '10,000459', 
           'This is a sentance, with comma number 1 and dot.', '121.124']

try:

    def find_float(num):
        num = num.split('.')
        if num[-1] is not None and num[-1].isdigit():
            return True
        else:
            return False

    for i in inNumber:
        i = str(i).replace(',', '.')
        if '.' in i and find_float(i):
            print('This is float', i)
        elif i.isnumeric():
            print('This is an integer', i)
        else:
            print('This is not a number ?', i)

except Exception as err:
    print(err)

ใช่ฉันทำแล้วก็ไม่ได้ผล และฉันค่อนข้างมั่นใจว่าคุณไม่ได้ลองจริงๆ เพราะมันไม่ทำงาน
JJJ

แน่นอนว่ามีวิธีโจมตีน้อยกว่า แม้ว่าคุณจะถูกต้องฉันแค่ใช้การทดสอบมากขึ้นมันไม่ได้ทำงานในทุกกรณี
Magotte

@JJJ วิธีการแก้ปัญหานี้?
Magotte


-1
def is_int(x):
  absolute = abs(x)
  rounded = round(absolute)
  if absolute - rounded == 0:
    print str(x) + " is an integer"
  else:
    print str(x) +" is not an integer"


is_int(7.0) # will print 7.0 is an integer

func ตรวจสอบ ints แต่จะส่งกลับค่าจริงสำหรับการลอยที่เป็น. 0
Gideon Lytes

โปรดอธิบายว่าเหตุใดการบริจาคของคุณจึงช่วยแก้ปัญหา OPs ได้
Heri

@Heri เขาต้องการตรวจสอบว่าตัวเลขเป็น int หรือ float ฟังก์ชันที่ฉันกำหนดสามารถทำได้ abs เป็นฟังก์ชัน python แบบ inbuilt ที่ส่งคืนค่าสัมบูรณ์ของตัวเลขรอบยังเป็น func inbuilt ที่ปัดเศษ จำนวนถ้าฉันลบจำนวนที่ปัดออกจากค่าสัมบูรณ์และฉันได้รับศูนย์จากนั้นจำนวนนั้นเป็น int หรือมันมีศูนย์เป็นหลังทศนิยมตำแหน่ง
Gideon Lytes


-5

variable.isnumeric ตรวจสอบว่าค่าเป็นจำนวนเต็ม:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.