Python 转换输入时“ValueError:无法将字符串转换为浮点数”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/54065751/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
"ValueError: could not convert string to float" when converting input
提问by Vlad Poncea
Recently I have been working on a code and got stuck for days on this error. Basically the program calculates how many calories you have to eat everyday. I have to take input from an entry and I don't know how to convert that input(it's a string by default) into a float to start using the numbers. I am using Python 3 with Tkinter.
最近我一直在研究一个代码,并因为这个错误而卡住了好几天。基本上,该程序会计算您每天必须摄入多少卡路里。我必须从条目中获取输入,但我不知道如何将该输入(默认为字符串)转换为浮点数以开始使用数字。我在 Tkinter 中使用 Python 3。
Here is the code:
这是代码:
from tkinter import *
root = Tk()
root.geometry("1000x500")
root.resizable(FALSE, FALSE)
root.title("BMI Calculator")
def calc(args):
def BMI_temp(args):
print(str(boyage))
BMI = IntVar()
BMI = 66.5 + (13.75 * float(boykg)) + (5.003 * float(boycm)) - (6.755 * float(boyage))
bmi_temp = Label(root, text="This is how many calories you have to eat if you have a non-active life: " + str(float(BMI)))
bmi_temp.grid(row=3, sticky=W)
def boy_age_fnct(args):
boy_age_entry.focus_set()
boy_cm_entry.delete(0, "end")
boy_age.grid(row=2, sticky=W)
boy_age_entry.grid(row=2, column=1)
boy_age_entry.bind("<Return>", BMI_temp)
def boy_cm_fnct(args):
boy_cm_entry.focus_set()
boy_kg_entry.delete(0, "end")
boy_cm.grid(row=1, sticky=W)
boy_cm_entry.grid(row=1, column=1)
boy_cm_entry.bind("<Return>", boy_age_fnct)
boy_kg_entry.focus_set()
temp = boygirle.get()
gender = temp.title()
welcome.destroy()
hello_lbl.destroy()
boygirle.destroy()
boygirlq.destroy()
if gender[0] == 'B':
boy_kg.grid(row=0, sticky=W)
boy_kg_entry.grid(row=0, column=1)
boy_kg_entry.bind("<Return>", boy_cm_fnct)
boyage = boy_age_entry.get()
boycm = boy_cm_entry.get()
boykg = boy_kg_entry.get()
def hello(args):
name_user = name_entry.get()
name2 = name_user.title()
name_entry.delete(0, "end")
hello = "Hello " + name2 + "!"
hello_lbl["text"] = hello
hello_lbl.grid(row=2, sticky=W)
btn_cont.grid(row=3, sticky=W)
name.destroy()
name_entry.destroy()
btn_cont.focus_set()
def BMI():
btn_cont.destroy()
boygirlq.grid(row=3, sticky=W)
boygirle.grid(row=3, column=0, ipadx=35)
boygirle.bind("<Return>", calc)
boygirle.focus_set()
welcome = Label(root, text="Hello! This is a BMR calculator. It tells you how many calories you have to eat!", font="System 14 bold")
name = Label(root, text="Please enter your name:", font="System 12")
hello_lbl = Label(root, font="System 14")
boygirlq = Label(root, text="Are you a boy or a girl?", font="System 12 bold")
boy_kg = Label(root, text="Please enter your weight(in kg):", font="System 12 bold")
boy_cm = Label(root, text="Please enter your height(in cm):", font="System 12")
boy_age = Label(root, text="Please enter your age(in years):", font="System 12")
btn_cont = Button(root, text="Continue", font="Helvetica 12", command=BMI, relief=RAISED)
boy_kg_entry = Entry(root, font="System 12", relief=SUNKEN)
boy_cm_entry = Entry(root, font="System 12", relief=SUNKEN)
boy_age_entry = Entry(root, font="System 12", relief=SUNKEN)
name_entry = Entry(root, font="System 12", relief=SUNKEN)
boygirle = Entry(root, font="System 12", relief=SUNKEN)
name_entry.bind("<Return>", hello)
name_entry.focus_set()
welcome.grid(row=0, columnspan=2, ipadx=200)
name.grid(row=1, sticky=W)
name_entry.grid(row=1, column=0)
root.mainloop()
I tried all the methods I found on the internet but nothing worked.
我尝试了在互联网上找到的所有方法,但没有任何效果。
回答by user24343
Probable cause: you forgot to fill out one field
可能的原因:您忘记填写一项
Explanation
解释
a floatcanbe constructed from a str, it just has to have the right format.
You should be able to convert strings that look like floats to floats by just using float(mystr)
.
可以从 str 构造一个浮点数,它只需要具有正确的格式。您应该能够仅使用 将看起来像浮点数的字符串转换为浮点数。float(mystr)
Pay attention to:
注意:
- No spaces (or non-digit characters)
- Period (.) as decimal separator, not comma (,)
- somespecial things are allowed (e.g. "inf", "5e3", ...)
- 没有空格(或非数字字符)
- 句点 (.) 作为小数点分隔符,而不是逗号 (,)
- 一些特殊的东西是允许的(例如“inf”,“5e3”,...)
Most probably (if you didn't cut anything off your error message), you forgot to fill out one field and are thus trying to perform float('')
.
很可能(如果您没有从错误消息中删除任何内容),您忘记填写一个字段并因此尝试执行float('')
.
Some examples
一些例子
>>> float('') # probably your case
Traceback (most recent call last):
File "<pyshell#74>", line 1, in <module>
float('')
ValueError: could not convert string to float:
>>> float('1')
1.0
>>> float('1.0')
1.0
>>> float('no number')
Traceback (most recent call last):
File "<pyshell#64>", line 1, in <module>
float('no number')
ValueError: could not convert string to float: 'no number'
>>> float('10e30')
1e+31
>>> float('inf')
inf
>>> float('123.456')
123.456
>>> float('123,456') # , not allowed
Traceback (most recent call last):
File "<pyshell#68>", line 1, in <module>
float('123,456')
ValueError: could not convert string to float: '123,456'
>>> float('123 456') # no whitespace as separator
Traceback (most recent call last):
File "<pyshell#69>", line 1, in <module>
float('123 456')
ValueError: could not convert string to float: '123 456'
Further thoughts
进一步的想法
An alternative for getting the float values is asking for them in a popup window -- this can be done with tkinter.simpledialog.askfloat
. This will return you a float
directly and show an error message if the string entered could not be converted.
But, it may also return None
when the user clicks the "Cancel" button, so you might want to check the result before computing stuff.
获取浮点值的另一种方法是在弹出窗口中询问它们——这可以通过tkinter.simpledialog.askfloat
. float
如果输入的字符串无法转换,这将直接返回一个并显示错误消息。
但是,None
当用户单击“取消”按钮时它也可能返回,因此您可能需要在计算内容之前检查结果。
Example:
例子:
import tkinter as tk
from tkinter.simpledialog import askfloat
def click():
val = askfloat('Title', 'The prompt:') # float or None (cancel)
if val is not None:
tk.Label(root, text=f'The value "{val}" is a valid float').pack() # f-string, replace with `'The value "{}" is ...'.format(val)` if you get an error (Python < 3.6)
root = tk.Tk()
tk.Button(root, text='Click!', command=click).pack()
root.mainloop()
Edit:
编辑:
If you keep the Entry
widgets, you may want to catch the error and show the user a message. This can easily be done with tkinter.mesagebox
, specifically of this case the showerror
function.
如果您保留Entry
小部件,您可能希望捕获错误并向用户显示一条消息。这可以很容易地完成tkinter.mesagebox
,特别是在这种情况下的showerror
功能。
Example:
例子:
import tkinter as tk
from tkinter.messagebox import showerror
def click():
try:
val = float(entry.get())
except ValueError as e:
showerror('Error title', 'The number could not be converted to float:\n'+str(e))
else:
entry.delete(0, tk.END)
Label(root, text=val).pack()
root = tk.Tk()
entry = tk.Entry(root)
tk.Label(root, text='insert a float value below:').pack()
entry.pack()
tk.Button(root, text='and click!', command=click).pack()
root.mainloop()