【问题标题】:Format value to float with width and precision将值格式化为随宽度和精度浮动
【发布时间】:2014-03-24 15:10:37
【问题描述】:

我想验证一个字符串输入,以验证它是否可以格式化为给定宽度和精度的有效浮点数。

width = 10
precision = 4

value = '12'

try:
   "{10.4f}".format(value)
except:
   print "not valid"

此测试失败,但它应该可以工作,因为 12 可以被视为浮点数 12.0000

我也想进行动态测试,因为宽度和精度是变量。

感谢您的帮助!

【问题讨论】:

    标签: python floating-point


    【解决方案1】:

    您忘记了: 冒号:

    "{:10.4f}".format(float(value))
    

    否则 Python 会将第一个数字解释为位置参数索引。

    每个参数都可以用它自己的占位符来设置:

    "{value:{width}.{precision}f}".format(
        value=float(value), width=width, precision=precision)
    

    widthprecision 参数在 value 格式化之前被插值。

    但是,这不是对浮点输入的良好测试。浮点值12.234不能精确表示;二进制分数只能近似它:

    >>> format(12.234, '.53f')
    '12.23399999999999998578914528479799628257751464843750000'
    

    所以这个值不会“适合”您的 10.4 约束,但在四舍五入时看起来就像一个完全有效的输入。

    任何浮点值都可以格式化为固定宽度,在任何情况下:

    >>> format(10**11 + 0.1, '10.4f')
    '100000000000.1000'
    

    不会提出ValueError;宽度参数中的10 表示:产生一个至少有这么多字符宽度的字符串,如果它更短则用空格填充,并且这个宽度包括小数点点和小数。

    要验证浮点输入,最好的办法是测试它是否可以转换为浮点数,然后测试最小值和最大值:

    try:
        value = float(value)
    except ValueError:
        # cannot be converted to a valid float
        return "Not a valid input"
    else:
        if 0 <= value < 10 ** 11:
            return "Value out of range"
    

    【讨论】:

    • 是的,谢谢。如何更改变量的 10 和 4?
    • 感谢您的完美回答!你能说出为什么在打印时格式化值之前有前导空格吗?
    • @BelowtheRadar:您指定了宽度;您正在将浮点值打印到至少 10 个字符的宽度(包括 4 个小数和小数点);任何最终比它短的值都用空格填充。宽度 not 的意思是“将值向下舍入到小数点前 10 位”..
    【解决方案2】:

    让我们使用 Python 3

    Format Specifierf"{var}"

    >>> width = 10
    >>> precision = 4
    >>> value = decimal.Decimal("12.34567")
    >>> f"result: {value:{width}.{precision}}"  # nested fields
    'result:      12.35'
    

    【讨论】:

      【解决方案3】:

      我认为这里存在类型不匹配...

      value = 12
      

      不是

      value = '12'
      

      【讨论】:

      • 嗨,输入是一个字符串,我想尝试格式化为浮动
      【解决方案4】:

      首先,而不是

      "{10.4f}".format(value)
      

      写成: "{10.4f}".format(float(value))

      转成字符串先浮动

      关于如何概括这一点:不要硬编码字符串“{10.4f}”,而是创建它

      width = 10
      precision = 4
      formatting_string = '{' + str(width) + '.' + str(precision) + 'f}'
      

      那个,使用

      formatting_string.format(float(value))
      

      【讨论】:

        【解决方案5】:

        使用字符串 rjust 和 ljust:

        value.rjust(width)+'.'.ljust(precision+1,'0')+'f'
        

        输出:

                12.0000f
        

        这样我们就不需要把value转成float了

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-20
          • 1970-01-01
          • 1970-01-01
          • 2017-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多