Skip to main content
 首页 » 编程设计

python之Django 是否有现成的模块来格式化距离

2025年05月04日24Leo_wl

例如,距离以米为单位定义。
程序应按比例格式化值:

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已启动,但问题仍然悬而未决。

请您参考如下方法:

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

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

仔细查看您的代码后,我发现了一些不一致之处:

  • 1.99999 返回为 1m(可能应该是 2m)
  • 我假设您想保留两位有效数字,但 1.2 返回为 1m 或 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。