在Django/Python中字符串转换为整数出错

6 投票
3 回答
32188 浏览
提问于 2025-04-17 02:27

我正在尝试把一个字符串转换成整数,这样我就可以保持一个累加的总数,并且希望能够在django模板中输出这个总数。

def stats(request):
    stats = []
    players = Player.objects.all()

    for player in players:
        player_stats = PlayerStat.objects.filter(player__id=player.pk)
        for n,stat in enumerate(player_stats):
            if n == 0: 
                    passing_completions = stat.passing_completions
            else:
                passing_completions += stat.passing_completions

        stats.append((player.first_name, player.last_name, player.team, passing_completions))

    return render_to_response('preps/stats.html', {'stats': stats, })

我试着在stat.passing_completions周围加上int(),但是这样就出现了错误 invalid literal for int() with base 10: '',意思是无法把空字符串转换成整数。

于是我用了 isdigit() 方法,确保只有包含数字的字符串才会被转换,像这样:

for player in players:
    player_stats = PlayerStat.objects.filter(player__id=player.pk)

    for n,stat in enumerate(player_stats):
        if n == 0: 
            if stat.passing_completions.isdigit():
                passing_completions = int(stat.passing_completions)
        else:
            if stat.passing_completions.isdigit():
                passing_completions += int(stat.passing_completions)

    stats.append((player.first_name, player.last_name, player.team, passing_completions))

但是我又遇到了一个错误 Caught TypeError while rendering: 'int' object is not iterable,这表示我在处理整数的时候出了问题。

模型结构

class PlayerStat(models.Model):
    player = models.ForeignKey(Player)

    week_num = models.CharField(
        max_length = 10,
        choices = (('1', 'Sep 2nd',), ('2', 'Sep 9th',), ('3', 'Sep 16th',),('4', 'Sep 23rd',), ('5', 'Sep 30th',), ('6', 'Nov 2nd',),('7', 'Nov 7th',), ('8', 'Nov 14th',), ('9', 'Nov 21st',),('10', 'Nov 28th',), ('11', 'Dec 4th',), ('12', 'Dec 11th',), ),
        blank = True,
        null=True
        )
    rushing_attempts = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Attempts",
        blank=True
        )
    rushing_yards = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Yards",
        blank=True
        )
    rushing_touchdowns = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Touchdowns",
        blank=True
        )
    passing_completions = models.CharField(
        max_length = 100,
        verbose_name = "Passing Completions",
        blank=True
        )
    passing_attempts = models.CharField(
        max_length = 100,
        verbose_name = "Passing Attempts",
        blank=True
        )
    passing_yards = models.CharField(
        max_length = 100,
        verbose_name = "Passing Yards",
        blank=True
        )
    passing_touchdowns = models.CharField(
        max_length = 100,
        verbose_name = "Passing Touchdowns",
        blank=True
        )
    receptions = models.CharField(
        max_length = 100,
        verbose_name = "Receptions",
        blank=True
        )
    receiving_yards = models.CharField(
        max_length = 100,
        verbose_name = "Receiving Yards",
        blank=True
        )
    receiving_touchdowns = models.CharField(
        max_length = 100,
        verbose_name = "Receiving Touchdowns",
        blank=True
        )

任何帮助都将不胜感激。

谢谢

3 个回答

2

你应该检查一下 stat.passing_completions 这个值是不是空字符串。你可以使用:

for player in players:
    player_stats = PlayerStat.objects.filter(player__id=player.pk)
    for n,stat in enumerate(player_stats):
        if n == 0 and stat.passing_completions:  # n is 0 and passing_completions is something meaningful
                passing_completions = int(stat.passing_completions)
        elif stat_passing_completions:  # n is not 0
            passing_completions += int(stat.passing_completions)
        else:
            pass  # in this case, stat.passing_completions is an empty string ('')

    stats.append((player.first_name, player.last_name, player.team, passing_completions))
5

我知道这个问题已经很久了,但如果有人需要的话,这里有一个我用来把字符串转换成整数的小方法,完全没有问题:

def int_or_0(value):
    try:
        return int(value)
    except:
        return 0

就这样。;)

12

我有时候会用这个小技巧:

 a = int('0' + someString)

在一个字符串前面加个零,可以确保这个字符串里至少有一个“0”。为了更保险,你可以用正则表达式从“'0'+someString”中提取出所有的数字。

撰写回答