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)
Easy with 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)
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