2009-05-08 15 views
33

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.Mostrar solamente el punto decimal si el componente de punto flotante no es .00 sprintf/printf

I.e.

  • 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 preguntándome si hay un sprintf -sólo forma de hacerlo?

lo estoy haciendo bien perezosamente en el rubí de este modo:

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

4 años más tarde y me di cuenta que eso es Regexp sutilmente engañosa. '.gsub (/ (\. 0 +)? x /, 'x')' es probablemente mejor ... –

Respuesta

44

que desea utilizar %g en lugar de %f:

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

impresionante. funciona bien en mi escenario. Desafortunadamente, parece que "% .3gx" no funciona como esperaba. el 3 es el total de dígitos, no el máximo de dígitos después del punto decimal. Eso significa que 2.12345 será 2.12 pero 22.12345 será 22.1 en vez de 22.12.Afortunadamente, en mi caso, no importa, pero ¿conoces una forma de evitarlo? –

+5

El formateo con% g dará la representación 'natural' del número (sin los ceros finales) o la representación científica (lo que sea más corto, básicamente). % .3g, como señaló, establece el número total de dígitos en 3 en lugar de establecer el número de dígitos después del punto decimal. Si desea controlar el número de dígitos después del punto decimal, necesita usar% f, ya que% .3f especifica 3 dígitos después del punto decimal (relleno con 0, si es necesario). Desafortunadamente, no conozco una manera de mezclar y combinar estas dos alternativas. – Naaff

2

me encontré con esto, la revisión anterior no ha funcionado, 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 
26

Puede mezclar un d partido% gy% f, así:

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

Ésta es otra manera:

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

O como un bonito de una sola línea:

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

Estaba buscando una función para truncar (no aproximar) un número flotante o decimal en Ruby on Rails, me imagino el 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. :-)

4

que terminó con

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

esta manera de llegar incluso números en lugar de cadenas

Cuestiones relacionadas