【问题标题】:Only show decimal point if floating point component is not .00 sprintf/printf如果浮点组件不是 .00 sprintf/printf,则仅显示小数点
【发布时间】:2009-05-08 03:08:21
【问题描述】:

我非常喜欢格式化浮点数,但如果没有相关的浮点数,我希望它显示为整数。

  • 1.20 -> 1.2x
  • 1.78 -> 1.78x
  • 0.80 -> 0.8x
  • 2.00 -> 2x

我可以通过一些正则表达式来实现这一点,但想知道是否有 sprintf-only 这样做的方式?

我在 ruby​​ 中相当懒惰地这样做:

("%0.2fx" % (factor / 100.0)).gsub(/\.?0+x$/,'x')

【问题讨论】:

  • 4 年后,我意识到 Regexp 具有微妙的误导性。 .gsub(/(\.0+)?x/, 'x') 可能更好...

标签: ruby floating-point printf


【解决方案1】:

您想使用%g 而不是%f

"%gx" % (factor / 100.00)

【讨论】:

  • 太棒了。在我的场景中效果很好。不幸的是,尽管“%.3gx”似乎不像我预期的那样工作。 3 是总位数,而不是小数点后的最大位数。这意味着 2.12345 将是 2.12,但 22.12345 将是 22.1 而不是 22.12。幸运的是,在我的情况下这并不重要,但你知道解决方法吗?
  • 使用 %g 格式化将给出数字的“自然”表示(没有尾随零)或科学表示(基本上以较短者为准)。正如您所指出的,%.3g 将总位数设置为 3,而不是设置小数点后的位数。如果要控制小数点后的位数,则需要使用 %f,因为 %.3f 指定小数点后 3 位(如果需要,用 0 填充)。不幸的是,我不知道如何混合和匹配这两种选择。
【解决方案2】:

您可以像这样混合和匹配 %g 和 %f:

"%g" % ("%.2f" % number)

【讨论】:

  • 这会将大数改为科学记数法——即 1000000 变为 '1e+06'
【解决方案3】:

如果您使用的是 rails,您可以使用 rails 的 NumberHelper 方法: http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html

number_with_precision(13.001, precision: 2, strip_insignificant_zeros: true)
# => 13
number_with_precision(13.005, precision: 2, strip_insignificant_zeros: true)
# => 13.01

要小心,因为在这种情况下,精度是指小数点后的所有数字。

【讨论】:

    【解决方案4】:

    我最终得到了

    price = price.round(precision)
    price = price % 1 == 0 ? price.to_i : price.to_f
    

    这样你甚至可以得到数字而不是字符串

    【讨论】:

      【解决方案5】:

      我刚遇到这个,上面的修复没有用,但我想出了这个,它对我有用:

      def format_data(data_element)
          # if the number is an in, dont show trailing zeros
          if data_element.to_i == data_element
               return "%i" % data_element
          else
          # otherwise show 2 decimals
              return "%.2f" % data_element
          end
      end
      

      【讨论】:

        【解决方案6】:

        这是另一种方式:

        decimal_precision = 2
        "%.#{x.truncate.to_s.size + decimal_precision}g" % x
        

        或者作为一个不错的单行:

        "%.#{x.truncate.to_s.size + 2}g" % x
        

        【讨论】:

          【解决方案7】:

          轻松使用 Rails:http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_with_precision

          number_with_precision(value, precision: 2, significant: false, strip_insignificant_zeros: true)
          

          【讨论】:

            【解决方案8】:

            我正在寻找一个在 Ruby on Rails 中截断(不是近似)浮点数或十进制数的函数,我想出了以下解决方案:

            你们可以在你的控制台试试,例子:

            >> a=8.88
            >> (Integer(a*10))*0.10
            >> 8.8
            

            我希望它可以帮助某人。 :-)

            【讨论】:

              猜你喜欢
              • 2016-02-09
              • 1970-01-01
              • 1970-01-01
              • 2014-12-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多