在Django中删除前导零

时间:2019-03-05 23:59:30

标签: python django

我正在显示MySQL数据库中的数据。我想删除某些字段(opsobp字段中的前导零),当小数点左侧的值为0时,仅。如果小数点左边的数字不为0,那么我显然希望显示该数字。

例如,

  • 0.750变为.750

  • 1.000保持不变

我怀疑这可以在使用Django模板或views.py中调用数据时完成。我该怎么办?

对此将大有帮助!谢谢。

views.py

from django.shortcuts import render
from .models import BattingRegStd


# Create your views here.
def batting(request):
    battingregstd2018 = BattingRegStd.objects.filter(year=2018)
    return render(request, 'playerstats/battingReg2018.html', {'battingregstd2018':battingregstd2018})

models.py

class BattingRegStd(models.Model):
    id = models.IntegerField(db_column='ID', primary_key=True)  # Field name made lowercase. 
    obp = models.FloatField(db_column='OBP', blank=True, null=True)  # Field name made lowercase.
    ops = models.FloatField(db_column='OPS', blank=True, null=True)  # Field name made lowercase.
    tb = models.IntegerField(db_column='TB', blank=True, null=True)  # Field name made lowercase.

HTML

{% extends "base.html" %} 

{% block contents %}
<div>
    <table>
        <thead>
            <tr>
                <th>OBP</th>
                <th>OPS</th>
                <th>TB</th>
            </tr>
        </thead>
        <tbody>
            {% for index in battingregstd2018%}
                <td>{{ index.obp}}</td>
                <td>{{ index.ops}}</td>
                <td>{{ index.tb}}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</div>
{% endblock %}

3 个答案:

答案 0 :(得分:1)

您可以使用

def batting_avg_format(num):
    numstr = str(num)
    if numstr[0]!='0':
        return numstr
    else:
        return numstr[1:]

可以将其作为方法BattingRegStd上的模型并加以应用,或者在过滤模型之后但呈现HTML之前直接进行列表理解。将其合并为模型方法的优点是,只要方法中唯一的参数为self,您现在就可以从模板中调用它。

答案 1 :(得分:0)

您可以在经过Python 3.5.3测试的Python shell中确认的示例:

x = "0.750"
x.lstrip("0")
> '.750'

# Included because a normal floating point type won't print trailing zeroes:
from decimal import Decimal
x = Decimal("0.750")
x.to_eng_string().lstrip("0")
> '.750'
str(x).lstrip("0")
> '.750'

虽然除非您已将引擎换成jinja2或其他允许方法调用中允许的内容,否则您将无法在Django模板中执行此操作,但是您可以在视图中执行此操作(可能很难看,具体取决于如何您要提取此数据),也可以使用简单的custom template filter

答案 2 :(得分:0)

我认为该值大于零。

views.py

def batting(request):
    battingregstd2018 = BattingRegStd.objects.filter(year=2018)

    for i in range(0, len(battingregstd2018)):
        # if need to edit value
        if battingregstd2018[i].obp is not None and battingregstd2018[i].obp < 1:
            # data edit as string
            # data type does not matter in template
            battingregstd2018[i].obp = str(battingregstd2018[i].obp)[1:]
        if battingregstd2018[i].ops is not None and battingregstd2018[i].ops < 1:
            battingregstd2018[i].ops = str(battingregstd2018[i].ops)[1:]

    return render(request, 'playerstats/battingReg2018.html', {'battingregstd2018':battingregstd2018})




比第二次尝试
这次我们只修复模板。使用原始的view.py

{% for index in battingregstd2018%}
    <td>
    {% if index.obp is None %}
    -
    {% elif index.obp < 1 %}
    .{{index.obp|slugify|slice:"1:"}}
    {% else %}
    {{index.obp}}
    {% endif %}
    </td>
{% endfor %}

.{{index.obp|slugify|slice:"1:"}}
|slice仅可用于字符串数据类型。
|slugify转换为ASCII以供使用|slice。但小数点被删除。
所以我在前面加了.

ps)
也许,浮点类型会将0.750存储为0.75。如果您想0.750而不是使用.{{index.obp|floatformat:"3"|slugify|slice:"1:"}}