用户输入的数字上的“计数数字”(Python 2.x)

时间:2016-08-17 01:14:43

标签: python python-2.7

我刚刚开始学习Python(2.x),请接受我的新手问题。 我正在尝试运行一个脚本,用户可以输入任何数字(例如整数或浮点数),预期输出将是该输入数字的总数字数。

然而,我遇到了以下问题,并想知道你是否可以帮助指导我解决它们。非常感谢!! :)

(问题)

  1. 在打印输出消息中,n值始终为0;而我希望用户打印出原始输入数字。

  2. 我希望它也能处理浮点数。现在,只要输入了一个浮点数,就会返回一个'ValueError'并停止脚本。

  3. 如果用户输入任何字符串或空白字符,脚本应忽略输入并再次重复询问用户输入,直到输入格式正确的数字(即整数或浮点数)。

  4. def num_digits(n):
        count = 0
        while n:
            count = count + 1
            n = n/10
        print 'The total digits for this number, ', n, ', are: ', count
        return count
    
    user_input = abs(int(raw_input('Enter a number:\n')))
    num_digits(user_input)
    

4 个答案:

答案 0 :(得分:1)

由于您还希望能够计算浮点数,只需执行n/10就不够了。使用浮点值,你的循环将最终变为无限,因为它将执行浮点除法而不是int除法。 (例如16.3 / 10 = 1.63 - > 1.63 / 10 = .163等 - 它永远不会到达0

为避免此问题,我建议将数字视为字符串,并计算字符串中数字的字符数。

def num_digits(n):
    count = 0
    curr = n # remaining string you're currently evaluating
    while (curr != ''):
        digit = curr[len(curr)-1] # get final char
        curr = curr[:len(curr)-1] # trim last char off the string
        if (not digit.isdigit()):
            # ignore things like decimal points or negative signs
            continue
        count += 1
    return count

while True:
    value = raw_input('Enter a number:\n') # keep it in string form
    try:
        convert = float(value) # if it's a valid float, then it's also a valid int
        break
    except:
        print "not a number. enter a valid number"

nd = num_digits(value)
print('{} has {} digits'.format(value, nd))

示例输出:

# float number, ignores negative sign and decimal point
$ python script.py 
Enter a number:
-16.3
-16.3 has 3 digits

# asks for input until it has a valid number
$ python script.py 
Enter a number:
foo
not a number. enter a valid number
Enter a number:
blah3
not a number. enter a valid number
Enter a number:
89
89 has 2 digits

答案 1 :(得分:1)

另一个答案已经解释了你的错误。无论如何,这里有几个其他的选项供你观看&理解:

def num_digits1(n):
    return len(str(n).replace(".", "").replace("-", ""))


def num_digits2(n):
    return sum(c.isdigit() for c in str(n))

for v in [-1.0, 0, 00, 000, 1.0, 1e2, 1e-2]:
    print v, num_digits1(v), num_digits2(v)

答案 2 :(得分:0)

n总是为零,因为你有这一行:

while n:

如果不成为False-y值,它永远不会退出该循环。如果要保留原始值,请对副本进行操作,或存储原始值:

def num_digits(n):
    original = n
    ...  # the rest of your code

对于浮点数,您需要将输入转换为浮点数,即

user_input = abs(float(raw_input('Enter a number:\n')))

最后,如果你想要一个号码,你可以这样做:

invalid_input = True
while invalid_input:
    user_input = raw_input('Enter a number:\n')
    try:
        number = abs(float(user_input))
    except ValueError:
        print('***ERROR*** Please enter a number.')
    else:
        num_digits(number)

当然,你可以让自己的生活变得更轻松,并将其他内容更改为:

    else:
        print(len(user_input.split('.')[0]))

split('.')[0]用于处理浮点数)

<强>更新

您似乎想要浮点数的实际长度,而不是使用您正在使用的精确算法。在这种情况下,忘记.split部分,print(len(user_input))应该做你想做的事。

答案 3 :(得分:0)

这应该做你要求的一切。随意评论任何问题

def num_digits():
    while True:
        n = raw_input('Enter a number:\n')
        try:
            float(n)
            if '.' and '-' in n:
                print len(n) - 2
            elif '.' in n or '-' in n:
                print len(n) - 1
            else:
                print len(n)
            break
        except:
            print 'Invalid Input\n'
            continue
num_digits()