2016-06-15 3 views
-1

Я хочу, чтобы проверить, если вход число (поплавок с 0, один или два знака после запятой) и больше, чем 0Проверка ввода десятичное число

def getnumber(): 
    print ("write a number: \n") 
    isValid = False 
    while not isValid: 
     try: 
      number = float(raw_input().replace(",",".")) 
      if number >= 0: 
       isValid=True 
      else: 
       print ("Number not valid") 
       isValid = False 
       getnumber() 
     except: 
      print ("Number not valid") 
    return number 

У меня есть следующие проблемы:

1- Я не знаю, как проверить, если есть только две десятичные

2- код не возвращает число, если сначала я ввести отрицательное число

кто-нибудь знает, как это исправить?

Большое спасибо

+0

Вы всегда можете проверить строку, чтобы увидеть, если есть один '.' и 2 знака после периода. – nbryans

+1

Я не уверен, почему вы заменяете запятые на десятичные точки. – holdenweb

+0

dang it, почему так много людей используют цикл while ** и recursion ** для ввода? удалить вызов 'getnumber()' внутри функции разрешит # 2. –

ответ

1

Причина, почему ваш код не работает с отрицательными числами, так как функция вызывает себя рекурсивно, когда число отрицательное, но значение isValid всегда ложно после этого разговора, поэтому повторения цикла.

Нет необходимости в булевой переменной.

Это оставляет вам проблему обнаружения двух знаков после запятой. Чтобы иметь возможность сделать это на уровне строк, вам нужно будет сохранить строку, которую вы преобразовали, в число с плавающей запятой. Предположим, что вы храните его как s, вы можете использовать некоторые тесты, такие как len(s) > 3 и s [-3] == '.'`, чтобы проверить его.

Это даст вам решение, как:

def getnumber(): 
    while True: 
     try: 
      s = raw_input("Write a number:").replace(",",".") 
      number = float(s) 
      if number >= 0 and len(s) > 3 and s[-3] ==".": 
       return number 
      else: 
       print("Negative or not two decimal places") 
     except Exception: 
      print("Invalid number") 

print(getnumber()) 
+0

И, разумеется, вы могли бы разбить тест, если бы вам нужны разные сообщения об ошибках для отрицательных чисел и неправильного количества мест. – holdenweb

+0

Удивительный. Большое спасибо. Он отлично работает :) – Jessica

+0

Хотя зачем вообще использовать «try ... except»? Это не приводит ничего к обнаружению недопустимого числа и может скрывать другие Исключения, которые должны обрабатываться явно. – zezollo

Смежные вопросы