如果浮点组件不是.00 sprintf/printf,则仅显示小数点

Bo *_*nes 39 ruby floating-point printf

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

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

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

我喜欢懒洋洋地在红宝石中这样做:

("%0.2fx" % (factor / 100.0)).gsub(/\.?0+x$/,'x')
Run Code Online (Sandbox Code Playgroud)

Naa*_*aff 48

你想用%g而不是%f:

"%gx" % (factor / 100.00)
Run Code Online (Sandbox Code Playgroud)

  • 使用%g格式化将给出数字的"自然"表示(没有尾随零)或科学表示(基本上较短者).正如您所指出的,%.3g将总位数设置为3而不是设置小数点后的位数.如果要控制小数点后的位数,则需要使用%f,因为%.3f指定小数点后的3位数(如果需要,用0填充).不幸的是,我不知道如何混合和匹配这两种选择. (6认同)
  • 真棒.在我的场景中运作良好.不幸的是,虽然似乎"%.3gx"不能像我期望的那样工作.3是总位数,而不是小数点后的最大位数.这意味着2.12345将是2.12但22.12345将是22.1而不是22.12.幸运的是在我的场景中没关系,但你知道解决方法吗? (2认同)

gyl*_*laz 27

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

"%g" % ("%.2f" % number)
Run Code Online (Sandbox Code Playgroud)


Vik*_*nic 20

如果你正在使用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
Run Code Online (Sandbox Code Playgroud)

注意,因为精确意味着在这种情况下小数点后的所有数字.

  • OP不会执行此操作,例如将1,000,000更改为“ 100万”。使用`number_with_precision` [代替](/sf/answers/3524584171/)。 (2认同)

Eug*_*ene 6

我结束了

price = price.round(precision)
price = price % 1 == 0 ? price.to_i : price.to_f
Run Code Online (Sandbox Code Playgroud)

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