如何在Python 3中创建一个将字符串转换为float的函数?

时间:2018-02-09 22:44:37

标签: python python-3.x

我有一个代码,要求您输入一笔钱。用户可以输入0-9,逗号",",小数"。"和美元符号" $"中的数字。所以该程序应该能够读取输入,例如" $ 4,599.80并且知道它意味着" 4599.80"。该计划还将确定您输入的金额税。税率为6%,因此程序将接受您的输入并乘以0.06并输出金额的税额。然后,程序应输出您输入的税额的总成本与税。因此,如果您输入了#100; $ 100",该程序应该输出税收为6美元,总金额为106美元。如果用户输入除了诸如任何其他符号(除了我上面列出的那些)或单词之外的其他内容,则该程序应该输出" -1"并说税收将是" -0.06"总数是" -1.06"。程序应继续要求用户输入金额,直到用户输入"退出"。我的程序一直说输出是" -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):

这是我的输出

Determine Price with Tax.
Enter 'exit' at any time to quit.
Enter Amount ($X,XXX.XX):
Amount: -1
Tax: -0.06
Price w/ Tax: -1.06
Enter Amount ($X,XXX.XX):
Amount: -1
Tax: -0.06
Price w/ Tax: -1.06
Enter Amount ($X,XXX.XX):
Amount: -1
Tax: -0.06
Price w/ Tax: -1.06
Enter Amount ($X,XXX.XX):
Amount: -1
Tax: -0.06
Price w/ Tax: -1.06
Enter Amount ($X,XXX.XX):
Amount: -1
Tax: -0.06
Price w/ Tax: -1.06
Enter Amount ($X,XXX.XX):

这是我的代码

print("Determine Price with Tax.")
print("Enter 'exit' at any time to quit.")
word = input("Enter Amount ($X,XXX.XX):\n")
def price_to_float(word):
    valid = "$,.1234567890"
    if word in valid:
        return float(word)
    else:
        return -1
while word.lower() != "exit":
    d = price_to_float(word)
    tax = 0.06
    print("Amount:",round(d,2))
    print("Tax:", (tax * d))
    print("Price w/ Tax:",round(d+d*tax,2))
    word = input("Enter Amount ($X,XXX.XX):\n")

我认为我的功能有问题所以它可能无法正确地将字符串转换为浮点数。我很感激任何建议!

4 个答案:

答案 0 :(得分:0)

有两个问题。

  1. 您的有效性检查

    if word in valid:
    

    将检查是否可以在有效字符列表中找到整个号码。

    解决方案是

    if all(character in valid for character in word):
    

    或者,更明确一点:

    for ch in word:
      if not ch in valid:
        return -1
    return float(word.replace("$",""))
    
  2. 美元符号和逗号

    美元符号和逗号阻止转换为浮动,因为它是意料之外的。

    在转换为float之前删除它:

    return float(word.replace("$","").replace(",",""))
    

答案 1 :(得分:0)

您的' price_to_float'功能似乎不像你描述的那样工作。

我建议你最初:

while word.lower() != "exit":
try:
    d = float(word)
    print(d)
    tax = 0.06
    print("Amount:",round(d,2))
    print("Tax:", (tax * d))
    print("Price w/ Tax:",round(d+d*tax,2))
    word = input("Enter Amount ($X,XXX.XX):\n")
except (EOFError):
    break

然后查看如何使用python 3的正则表达式:https://docs.python.org/2/library/re.html

答案 2 :(得分:0)

看看这个简单的例子,它显示了代码中的误解:

>>>"1.23" in ".123"
False

=>如果StringA作为一个整体包含在StringB中,则stringA in stringB仅返回true。默认情况下,它不会检查每个字母。

使用try& amp控制您的输入,但常用方法除外:

#python3
while True:

    word = input("Enter Amount ($X,XXX.XX):\n")

    if word.lower() == "exit": break

    word = word.replace(",","") #remove comma
    word = word.replace("$","") #remove dollar sign

    try:
        d = float(word)
    except ValueError:
        continue

    tax = 0.06
    print("Amount:",round(d,2))
    print("Tax:", (tax * d))
    print("Price w/ Tax:",round(d+d*tax,2))

答案 3 :(得分:-1)

您的price_to_float功能存在问题:

...
if word in valid:
...

这会查找字符串word中整个字符串valid的完全重复,如果word以美元符号后跟数字开头,则永远不会为真。

对类似问题的回答应该符合您的要求:  https://stackoverflow.com/a/8422055/4287278