You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

为什么这样能解决问题?

  1. 我们先把用户输入的字符串input_str转换成整数bettedc,如果输入不是合法整数,会直接进入except块,完美契合你原来的错误处理逻辑。
  2. 当输入合法时,bettedc已经是整数类型,此时使用{bettedc:,}就能正常生成带千分位的字符串,比如输入10000会输出User betted 10,000$。

另外提个小建议:递归调用betcurrency()虽然实现简单,但如果用户多次输入错误,可能会触发Python的递归深度限制。如果想让程序更健壮,可以改成while循环的形式,不过这属于额外优化,不影响当前问题的核心解决。

内容的提问来源于stack exchange,提问作者Lloyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 03:03:12