2010-03-05 5 views
5

J'ai un rapport dans lequel je liste les valeurs totales, puis les changements entre parenthèses. Par exemple:Convertir un entier en une chaîne signée en Ruby

Songs: 45 (+ 10 de la semaine dernière)

Je veux imprimer l'entier 10 comme "10" et -10 comme "-10"

En ce moment je faire

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

Y a-t-il un meilleur moyen?

Répondre

25
"%+d" % song_change 

String#% formate la main droite selon les spécificateurs d'impression dans la chaîne. Le spécificateur d'impression "% d" signifie décimal. entier, et le "+" ajouté au spécificateur d'impression force le signe approprié à toujours être imprimé.

Vous trouverez plus d'informations sur les spécificateurs d'impression dans Kernel#sprintf ou dans le man page for sprinf.

Vous pouvez formater plus d'une chose à la fois par le passage dans un tableau:

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

Vous pouvez ajouter une méthode à Fixnum appelée to_signed_s, mais cela peut être excessif. Vous élimineriez la copie et le collage, cependant, ce qui serait bien.

Personall, je voudrais juste écrire une classe StringUtil pour gérer la conversion. Sinon, une meilleure solution OO consisterait à enrouler le FixNum dans une classe de support et à surcharger les to_s de cette classe. IE: Créez une classe appelée SignedFixnum et enveloppez vos objets Fixnum à chaque fois qu'ils doivent être signés.

+0

J'aime la idée d'une nouvelle classe. Peut-être que cela semble exagéré, mais pour tout ce que nous savons il pourrait y avoir un tas d'autres fonctionnalités qui pourraient aller là-bas. Ou peut-être qu'il n'y en a pas encore mais il y en aura plus tard. – Shadowfirebird

+0

C'est un motif de décorateur assez simple, je pense. Pour les petits projets, c'est exagéré, mais si cela doit être réutilisé, cela pourrait rapporter gros. –

0

Je pense que votre code d'origine est bon, il suffit d'extraire dehors dans une aide afin qu'il n'encombre pas votre point de vue et vous n'avez pas à le répéter chaque fois que vous voulez l'utiliser.

Mettez dans votre fichier application_helper.rb comme celui-ci

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

Wayne déjà posté ce que je considère la meilleure option, mais voici une autre juste pour le plaisir ...

"#{'+' if song_change >= 0}#{song_change}" 
Questions connexes