2010-03-05 12 views
5

Tengo un informe en el que estoy enumerando los valores totales y luego los cambios entre paréntesis. Por ejemplo:Convierta un entero en una cadena con signo en Ruby

canciones: 45 (+10) de la semana pasada

así que quiero imprimir el número entero 10 como "10" y -10 como "-10"

Ahora mismo Estoy haciendo

(song_change >= 0 ? '+' : '') + song_change.to_s 

¿Hay una manera mejor?

Respuesta

25
"%+d" % song_change 

String#% formatea la mano del lado derecho de acuerdo con los especificadores de impresión en la cadena. El especificador de impresión "% d" significa decimal aka. entero, y el "+" agregado al especificador de impresión fuerza al signo apropiado a imprimirse siempre.

Puede encontrar más información sobre los especificadores de impresión en Kernel#sprintf, o en el man page for sprinf.

Puede dar formato a más de una cosa a la vez mediante el paso de una matriz:

song_count = 45 
song_change = 10 
puts "Songs: %d (%+d from last week)" % [song_count, song_change] 
# => Songs: 45 (+10 from last week) 
1

Puede agregar un método a Fixnum llamado to_signed_s, pero puede ser exagerado. Eliminaría copiar y pegar, sin embargo, lo cual sería bueno.

Personall, me gustaría escribir una clase StringUtil para manejar la conversión.

Alternativamente, una solución de OO mejor sería envolver el FixNum en una clase de titular y anular los to_s de esa clase.

IE: Crea una clase llamada SignedFixnum y envuelve tus objetos Fixnum cada vez que necesiten ser firmados.

+0

me gusta el idea de una nueva clase. Quizás eso parezca exagerado, pero, por lo que sabemos, podría haber muchas otras funcionalidades que podrían ir allí. O tal vez todavía no, pero habrá más tarde. – Shadowfirebird

+0

Este es un patrón Decorador bastante sencillo, creo. Para proyectos pequeños es excesivo, pero si esto se va a reutilizar mucho, podría generar grandes ganancias. –

0

creo que el código original es buena, simplemente extraerlo hacia un ayudante para que no saturar sus puntos de vista y no tiene que repetirlo cada vez que quiera usarlo.

ponerlo en su archivo application_helper.rb como esto

def display_song_change 
    (song_change >= 0 ? '+' : '') + song_change.to_s 
    end 
1

Wayne ya publicado lo que considero la mejor opción, pero aquí hay otra sólo por diversión ...

"#{'+' if song_change >= 0}#{song_change}" 
Cuestiones relacionadas