整数格式为int,浮点数格式为%.3f

3 投票
2 回答
18657 浏览
提问于 2025-04-17 02:35

我有一个函数,它需要两个截止值,分别叫做 min_dfmax_df。这两个值可以是一个整数(int),表示一个绝对的频率截止值;也可以是一个小数(float),表示一个相对的频率。现在,我想加一些检查,并给出合适的警告信息,但又不想让代码看起来太乱。这段代码可以做到:

if max_df < 0 or min_df < 0:
    raise ValueError, "neither max_df (%s) nor min_df (%s) may be <0" %
                      (max_df, min_df)

不过,当我用一个小数,比如 (1/3.) 时,警告信息里显示的是 0.333333333333。我希望它能显示成 0.333,所以我试了 %.3f,但这样会把整数值也变成小数,像 2 会显示成 2.000

我该怎么根据类型来得到正确的格式呢?我需要在传递给 % 操作符之前先构建格式字符串吗?

更新:我需要一些在 Python 2.5 中能用的东西,因为这是我目标支持的最低版本。

2 个回答

6

这样怎么样:

>>> "{:.4g}".format(1)
'1'
>>> "{:.4g}".format(1.3)
'1.3'
>>> "{:.4g}".format(1.333)
'1.333'
>>> "{:.4g}".format(1.333333)
'1.333'

不过(因为这4个有效数字也包括整数部分),你还会得到这个:

>>> "{:.4g}".format(10.333)
'10.33'
>>> "{:.4g}".format(10000)
'1e+04'
9

保持简单

def format_df(df):
    if isinstance(df, (int, long)):
        return "%d" % df
    elif isinstance(df, float):
        return "%.3f" % df
    else:
        return str(df) # fallback just in case

raise ValueError, "neither max_df (%s) nor min_df (%s) may be <0" %
                  (format_df(max_df), format_df(min_df))

撰写回答