Turtle图形界面中数字千分位格式化触发ValueError的技术问询
问题分析与解决方案
你遇到的ValueError是因为一个很容易忽略的类型细节:turtle.textinput()返回的是字符串类型,而你用的千分位格式化符:,只能用于数字(整数或浮点数),直接对字符串使用这个格式化规则自然会触发报错。
修复思路
在使用千分位格式化之前,必须先把用户输入的字符串转换成整数类型。更合理的做法是在try块里先完成类型转换,这样后续的金额判断和格式化都基于数字操作,逻辑更清晰,也能提前捕获非法输入。
修改后的代码
import turtle import json with open("data.json") as file: data = json.load(file) def betcurrency(): try: global bettedc # 先获取用户输入的字符串 input_str = turtle.textinput('Bet money.', f'You have {data["money"]:,}$. Remember, you can only bet money you have.') # 直接转换为整数,转换失败会触发except块 bettedc = int(input_str) if bettedc > data["money"]: print("User tried to bet what they didn't have.") betcurrency() elif bettedc < 0: print('User tried to bet a negative amount.') betcurrency() else: # 此时bettedc是整数,可正常使用千分位格式化 print(f'User betted {bettedc:,}$') except ValueError: print("User wrote a word or a float number.") betcurrency()
为什么这样能解决问题?
- 我们先把用户输入的字符串
input_str转换成整数bettedc,如果输入不是合法整数,会直接进入except块,完美契合你原来的错误处理逻辑。 - 当输入合法时,
bettedc已经是整数类型,此时使用{bettedc:,}就能正常生成带千分位的字符串,比如输入10000会输出User betted 10,000$。
另外提个小建议:递归调用betcurrency()虽然实现简单,但如果用户多次输入错误,可能会触发Python的递归深度限制。如果想让程序更健壮,可以改成while循环的形式,不过这属于额外优化,不影响当前问题的核心解决。
内容的提问来源于stack exchange,提问作者Lloyd
相关产品推荐
相关产品推荐

