Django是否有一个现成的模块来格式化距离?

时间:2012-12-14 11:13:24

标签: python django django-templates

例如,距离由米来定义 程序应按比例格式化值:

if distance < 100:
    return '%dm' % distance
elif distance < 1000:
    return '%.0fm' % round(distance, -1)
else:
    import math
    m, km = math.modf(distance / 1000.0)
    if m < 0.01:
        return '%.0fkm' % km
    else:
        return '%.1fkm' % km + round(m, 1)

使用现有的解决方案会很棒。

更新:django-distanceformatting已启动,但问题仍未解决。

1 个答案:

答案 0 :(得分:1)

Python有一些通用的单元处理模块,可以包装在模板标签中(没有特定的顺序):

也许其中一个可以满足您的需求。但我仍然坚持我之前的评论,如果你只需要这么少的功能,你就不必费心去重新发明轮子(或者你的一小部分)。

仔细查看代码后,我发现了一些不一致的地方:

  • 1.99999以1m(应该是2m)
  • 返回
  • 我假设您要保留两位有效数字,但1.2作为0m或0.12返回0m
  • 最后一行需要围绕值元组
  • 的括号

这是一个更加一致和简洁的函数版本(加上一点包围来测试):

from math import modf
def old_dist_format(distance):
    if distance < 100:
        return '%dm' % distance
    elif distance < 1000:
        return '%.0fm' % round(distance, -1)
    else:
        m, km = modf(distance / 1000.0)
        if m < 0.01:
            return '%.0fkm' % km
        else:
            return '%.1fkm' % (km + round(m, 1))


def dist_format(distance):
    rounded = float('%.2g' % distance)
    km = modf(rounded / 1000.0)
    if km[1]:
        return "%gkm" % (km[0] + km[1])
    else:
        return "%gm" % rounded


if __name__ == "__main__":
    while True:
        try:
            s = raw_input("> ")
            try:
                d = float(s)
            except ValueError:
                print "Enter number"
                continue
            print "%s\t%s" % (dist_format(d), old_dist_format(d))
        except KeyboardInterrupt:
            print
            break

dist_format()函数中的第一行始终保留两个有效数字。如果不需要,%g会从小数点中删除所有内容。警告:我的函数将给出(天文)距离的指数表示法> = 1000000000。