将int格式化为int,但将float格式化为%.3f

时间:2011-09-19 10:11:31

标签: python string-formatting python-2.5

我有一个函数需要两个截止值,称为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)

但使用float (1/3.),警告包含0.333333333333。我宁愿让它说0.333,所以我尝试了%.3f,但也将int值转换为浮点数,并为2.000显示2。< / p>

如何打开类型以获得正确的格式?在将格式字符串传递给%运算符之前,是否需要构建格式字符串?

更新:我需要一些适用于Python 2.5的东西,因为这是我定位的最低版本。

2 个答案:

答案 0 :(得分:8)

保持简单

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))

答案 1 :(得分: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'