【问题标题】:Validate floating values from user input验证来自用户输入的浮动值
【发布时间】:2018-10-23 00:43:19
【问题描述】:

这个函数将一个字符串作为输入。该字符串具有以下属性:

  • 包括字符 0-9
  • 可能包括表示美分的句点。 (如果不 包括假设 0 美分。)
  • 可能包含 $ 符号。
  • 可能包含逗号作为 数字分隔符。

您的函数会将字符串转换为浮点数。您不能使用任何内置命令,例如 int 或 float。你必须通过分析文本字符串中的字符来解决这个问题。

如果输入无效,则返回 -1 作为函数的结果。

如果我输入以下内容:

100.00
200
98.78
$1,009.78
Goat
exit

这是输出的样子:

Determine Price with Tax.
Enter 'exit' at any time to quit.
Enter Amount ($X,XXX.XX):
Amount: 100.0
Tax: 6.0
Price w/ Tax: 106.0
Enter Amount ($X,XXX.XX):
Amount: 200
Tax: 12.0
Price w/ Tax: 212.0
Enter Amount ($X,XXX.XX):
Amount: 98.78
Tax: 5.93
Price w/ Tax: 104.71
Enter Amount ($X,XXX.XX):
Amount: 1009.78
Tax: 60.59
Price w/ Tax: 1070.37
Enter Amount ($X,XXX.XX):
Amount: -1
Tax: -0.06
Price w/ Tax: -1.06
Enter Amount ($X,XXX.XX):

我的代码是:

def price_to_int(text):
    res = 0
    valid = "$,.1234567890"
    for l in text:
        if l in valid:
            res = float(text)
        else:
            return -1
    return res

#---------You may not make any changes below this line-----------   
print("Determine Price with Tax.")
print("Enter 'exit' at any time to quit.")
word = input("Enter Amount ($X,XXX.XX):\n")
while word.lower() != "exit":
    d = price_to_int(word)
    tax = 0.06
    print("Amount:",round(d,2))
    print("Tax:",round(d*tax,2))
    print("Price w/ Tax:",round(d+d*tax,2))
    word = input("Enter Amount ($X,XXX.XX):\n")

唯一错误的是函数定义。我的代码一直有效,直到我输入“$ 1009.78”。我被特别要求只重写函数定义而不更改任何其他内容。

【问题讨论】:

    标签: python validation input floating-point


    【解决方案1】:

    您当前的解决方案对我来说似乎不正确。您正在逐个字符地迭代字符串,强制每个参数。您想一次转换整个字符串(否则,您将如何获得浮点数?)。

    您想要使用try ... except 进行异常处理的解决方案吗?

    def price_to_int(text):
        clean_text = text.lstrip('$').replace(',', '')
        try:
            return int(clean_text)
        except:
            try:
                return float(clean_text)
            except ValueError:
                return -1
    

    此解决方案会清理您的字符串并尝试强制转换为浮动。如果无法进行转换,则会引发并处理错误,并返回 -1。

    详情

    • str.lstrip 删除前导 $ 字符
    • str.replace 删除逗号(当第二个参数为空字符串时)
    • try ... except ValueError: ... 将尝试在 try 块内运行代码,同时等待捕获 ValueError 异常。如果引发异常,则执行 except 块内的代码(否则不执行)。

    【讨论】:

    • 这将接受100.5,0 这可能是允许的,OP 没有指定逗号使用的限制。
    • @RyanHaining 嗯,你说得有道理,但是像这样棘手的输入将需要正则表达式,我认为这超出了入门级 python 课程的范围......但是我会继续关注 OP 的判决,如果他们决定得到,那就回来
    • 我的想法更像是parts = text.split('.'); dollars = parts[0],然后使用您在dollars 上的内容,如果存在parts[1],则将其粘贴到末尾
    • @RyanHaining 我仍然需要担心10,,00.00 之类的输入,这里有很大的余地会绊倒解释器......你在哪里停下来?
    • 逗号只能出现在从右到左的每第四位,并且不能是第一个非数字(,000 错误),因此您可以以这种方式扫描。 irl 一个正则表达式对吗?但这似乎是我在大一编程作业中所期望的那种事情
    猜你喜欢
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多