복붙노트

[PYTHON] 수레에 isdigit 사용하기?

PYTHON

수레에 isdigit 사용하기?

a = raw_input('How much is 1 share in that company? ')

while not a.isdigit():
    print("You need to write a number!\n")
    a = raw_input('How much is 1 share in that company? ')

이것은 사용자가 정수를 입력하는 경우에만 작동하지만 부동 소수점을 입력하더라도 작동하지만 문자열을 입력 할 때는 작동하지 않습니다.

따라서 사용자는 9와 9.2를 모두 입력 할 수 있어야하지만 abc는 입력 할 수 없어야합니다.

어떻게해야합니까?

해결법

  1. ==============================

    1.정규식을 사용하십시오.

    정규식을 사용하십시오.

    import re
    
    p = re.compile('\d+(\.\d+)?')
    
    a = raw_input('How much is 1 share in that company? ')
    
    while p.match(a) == None:
        print "You need to write a number!\n"
        a = raw_input('How much is 1 share in that company? ')
    
  2. ==============================

    2.EAFP

    EAFP

    try:
        x = float(a)
    except ValueError:
        print("You must enter a number")
    
  3. ==============================

    3.더 많은 Pythonic 방법이 일반적으로 ... except (즉 EAFP)를 시도한다는 점에서 기존 답변이 옳습니다.

    더 많은 Pythonic 방법이 일반적으로 ... except (즉 EAFP)를 시도한다는 점에서 기존 답변이 옳습니다.

    그러나 실제로 유효성 검사를 수행하려는 경우 isdigit ()을 사용하기 전에 정확히 1 소수점을 제거 할 수 있습니다.

    >>> "124".replace(".", "", 1).isdigit()
    True
    >>> "12.4".replace(".", "", 1).isdigit()
    True
    >>> "12..4".replace(".", "", 1).isdigit()
    False
    >>> "192.168.1.1".replace(".", "", 1).isdigit()
    False
    

    그러나이 함수는 int와는 다른 부동 소수점을 처리하지 않습니다. 당신이 정말로 필요하다면 그 수표를 추가 할 수 있습니다.

  4. ==============================

    4.dan04의 답변 작성 :

    dan04의 답변 작성 :

    def isDigit(x):
        try:
            float(x)
            return True
        except ValueError:
            return False
    

    용법:

    isDigit(3)     # True
    isDigit(3.1)   # True
    isDigit("3")   # True
    isDigit("3.1") # True
    isDigit("hi")  # False
    
  5. ==============================

    5.나는 @ dan04가 올바른 접근법 (EAFP)을 가지고 있다고 생각하지만, 불행히도 현실 세계는 종종 특별한 경우이며, 일부 코드는 실제로 관리해야한다. 그래서 아래는 좀 더 정교하고, 좀 더 실용적인 (현실적인) :

    나는 @ dan04가 올바른 접근법 (EAFP)을 가지고 있다고 생각하지만, 불행히도 현실 세계는 종종 특별한 경우이며, 일부 코드는 실제로 관리해야한다. 그래서 아래는 좀 더 정교하고, 좀 더 실용적인 (현실적인) :

    import sys
    
    while True:
        try:
            a = raw_input('How much is 1 share in that company? ')
            x = float(a)
            # validity check(s)
            if x < 0: raise ValueError('share price must be positive')
        except ValueError, e:
            print("ValueError: '{}'".format(e))
            print("Please try entering it again...")
        except KeyboardInterrupt:
            sys.exit("\n<terminated by user>")
        except:
            exc_value = sys.exc_info()[1]
            exc_class = exc_value.__class__.__name__
            print("{} exception: '{}'".format(exc_class, exc_value))
            sys.exit("<fatal error encountered>")
        else:
            break  # no exceptions occurred, terminate loop
    
    print("Share price entered: {}".format(x))
    

    샘플 사용법 :

    > python numeric_input.py
    How much is 1 share in that company? abc
    ValueError: 'could not convert string to float: abc'
    Please try entering it again...
    How much is 1 share in that company? -1
    ValueError: 'share price must be positive'
    Please try entering it again...
    How much is 1 share in that company? 9
    Share price entered: 9.0
    
    > python numeric_input.py
    How much is 1 share in that company? 9.2
    Share price entered: 9.2
    
  6. ==============================

    6.

    import re
    
    string1 = "0.5"
    string2 = "0.5a"
    string3 = "a0.5"
    string4 = "a0.5a"
    
    p = re.compile(r'\d+(\.\d+)?$')
    
    if p.match(string1):
        print(string1 + " float or int")
    else:
        print(string1 + " not float or int")
    
    if p.match(string2):
        print(string2 + " float or int")
    else:
        print(string2 + " not float or int")
    
    if p.match(string3):
        print(string3 + " float or int")
    else:
        print(string3 + " not float or int")
    
    if p.match(string4):
        print(string4 + " float or int")
    else:
        print(string4 + " not float or int")
    
    output:
    0.5 float or int
    0.5a not float or int
    a0.5 not float or int
    a0.5a not float or int
    
  7. ==============================

    7.

    s = '12.32'
    if s.replace('.', '').replace('-', '').isdigit():
        print(float(s))
    

    이것은 음수 float에도 적용됩니다.

  8. from https://stackoverflow.com/questions/4138202/using-isdigit-for-floats by cc-by-sa and MIT license