resueltos punto numeros notación normalizada formato flotante especificadores ejercicios ejemplos ruby floating-point printf

ruby - numeros - punto flotante ejercicios resueltos



Mostrar solo el punto decimal si el componente de punto flotante no es.00 sprintf/printf (8)

Estoy formateando bastante un número de coma flotante pero quiero que aparezca como un entero si no hay un número de coma flotante relevante.

Es decir

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

Puedo lograr esto con un poco de expresiones regulares, pero me pregunto si hay un sprintf una forma de hacer esto?

Lo estoy haciendo bastante perezosamente en ruby ​​como ese:

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


Aquí hay otra forma:

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

O como un buen trazador de líneas:

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


Desea utilizar %g lugar de %f :

"%gx" % (factor / 100.00)



Estaba buscando una función para truncar (no aproximar) un número flotante o decimal en Ruby on Rails, descubrí la siguiente solución para hacer eso:

Ustedes pueden probar en su consola, el ejemplo:

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

Espero que ayude a alguien. :-)


Me acabo de enterar de esto, la solución anterior no funcionó, pero se me ocurrió esto, que funciona para mí:

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


Puedes mezclar y unir% g y% f, así:

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


Si usa raíles, puede usar los métodos NumberHelper de rails: 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

Tenga cuidado, porque precisión significa todos los dígitos después del punto decimal en este caso.


Terminé con

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

de esta forma, incluso obtienes números en lugar de cadenas