2

たとえば、距離はメートル単位で定義されます。
手順は、スケールで値をフォーマットする必要があります。

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が起動されますが、質問は未解決のままです。

4

1 に答える 1

1

テンプレートタグでラップできる Python 用の一般的なユニット処理モジュールがいくつかあります (特定の順序はありません)。

そのうちの1人があなたに必要なものを与えてくれるかもしれません。しかし、必要な機能がごくわずかである場合は、車輪 (またはそのごく一部) を再発明する必要はないという以前のコメントを今でも支持しています。

コードを詳しく調べたところ、いくつかの矛盾が見つかりました。

  • 1.99999 は 1m として返されます (おそらく 2m のはずです)
  • 有効数字2桁を保持したいのだと思いますが、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()関数の最初の行は、常に 2 つの有効数字を保持します。%g は、必要がなければ小数点以下をすべて除外します。警告: 私の関数は、(天文学的な) 距離 >= 1000000000 の指数表記を提供します。

于 2012-12-14T22:22:21.257 に答える