2009-05-08 2 views
33

Я довольно форматирую число с плавающей запятой, но хочу, чтобы оно отображалось как целое число, если нет соответствующего числа с плавающей запятой.Показывать десятичную точку, если компонент с плавающей запятой не является .00 sprintf/printf

I.e.

  • 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') 
+0

4 года спустя, и я понял, что Regexp тонко вводит в заблуждение. '.gsub (/ (\. 0 +)? x /, 'x')', вероятно, лучше ... –

ответ

44

Вы хотите использовать %g вместо %f:

"%gx" % (factor/100.00) 
+1

awesome. хорошо работает в моем сценарии. К сожалению, похоже, что «% .3gx» работает не так, как я ожидал. 3 - это суммарные цифры, а не максимальные цифры после десятичной точки. Это означает, что 2.12345 будет 2.12, но 22.12345 будет 22.1 вместо 22.12.К счастью, в моем сценарии это не имеет значения, но знаете ли вы, как это происходит? –

+5

Форматирование с% g даст либо «естественное» представление числа (без конечных нулей), либо научное представление (в зависимости от того, что короче, в основном). % .3g, как вы указали, устанавливает общее количество цифр в 3, а не устанавливает количество цифр после десятичной точки. Если вы хотите контролировать количество цифр после десятичной точки, вам нужно использовать% f, так как% .3f задает 3 цифры после десятичной точки (при необходимости добавьте 0, если необходимо). К сожалению, я не знаю, как смешивать и сопоставлять эти две альтернативы. – Naaff

2

Я просто наткнулся на это, исправление выше Didnt работы, но я придумал это, что работает для меня:

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 
26

Вы можете смешивать d спичка% г и% е так:

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

Вот еще один способ:

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

Или как хороший однострочника:

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

Если вы используете рельсы, вы можете использовать методы NumberHelper для рельсов: http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html

number_to_human(a, precision: 6, strip_insignificant_zeros: true) 

Будьте осторожны, потому что точность означает все цифры (числа до и после десятичной точки)

-2

Я искал функцию для усечения (не приблизительного) числа с плавающей запятой или десятичного числа в Ruby on Rails, решение сделать это:

вы, ребята, можете попробовать в консоли, к примеру:

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

Я надеюсь, что это помогает кому-то. :-)

4

Я закончил с

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

Таким образом, вы даже получите цифры вместо строк