【问题标题】:How to create a function that converts a string into float in Python 3?如何在 Python 3 中创建一个将字符串转换为浮点数的函数?
【发布时间】:2018-02-09 22:44:37
【问题描述】:

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

我认为我的函数有问题,因此它可能无法正确地将字符串转换为浮点数。如有任何建议,我将不胜感激!

【问题讨论】:

  • if word in valid 不会按照您想要的方式工作。您需要单独检查单词的每个字符。

标签: python python-3.x


【解决方案1】:

您的“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

【讨论】:

  • 在 Python 中,缩进很重要。我认为您应该添加更多空间
  • 另外,您还没有测试过您的代码:如果您按照 OP 的描述输入 $
【解决方案2】:

有两个问题。

  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. 美元符号和逗号

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

    在转换为浮点数之前将其删除:

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

【讨论】:

    【解决方案3】:

    看看这个简单的例子,它说明了你的代码中有什么误解:

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

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

    使用 try&except 控制您的输入是一种常用方法:

    #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))
    

    【讨论】:

    • 你能把这个放到 python 3 中吗? :)
    • 是的,给我秒。但是,如果您需要转换,只需使用包含的 python 2to3。非常简单高效。 :)
    【解决方案4】:

    你的price_to_float函数有问题:

    ...
    if word in valid:
    ...
    

    这会在字符串 valid 中查找整个字符串 word 的精确副本,如果 word 以美元符号后跟数字开头,则永远不会正确。

    这个类似问题的答案应该可以满足您的需求: https://stackoverflow.com/a/8422055/4287278

    【讨论】:

    • 我们将不胜感激。
    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 2011-11-25
    • 2019-07-10
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多