2013-02-05 14 views
35

Come forzare l'output di variabile di stringa Ruby usando puts in n caratteri in modo che se la variabile è più lunga, sarà troncata, se più corta, sarà espansa trascinando o conducendo spazi?Come forzare la stringa Ruby in n caratteri

C'è qualche metodo standard per farlo?

risposta

49

Rubino supporta l'utilizzo di stringhe di formato, come molte altre lingue:

 
[11] (pry) main: 0> '%3.3s' % 'f' 
=> " f" 
[12] (pry) main: 0> '%3.3s' % 'foo' 
=> "foo" 
[13] (pry) main: 0> '%3.3s' % 'foobar' 
=> "foo" 

Se si vuole pad a destra, utilizzare un - nella stringa di formato:

 
[14] (pry) main: 0> '%-3.3s' % 'f' 
=> "f " 
[15] (pry) main: 0> '%-3.3s' % 'foo' 
=> "foo" 
[16] (pry) main: 0> '%-3.3s' % 'foobar' 
=> "foo" 

Si potrebbe anche usare printf o sprintf, ma preferisco il più generico %, che è come sprintf.

Dalle sprintf documentazione:

 
    s | Argument is a string to be substituted. If the format 
     | sequence contains a precision, at most that many characters 
     | will be copied. 

e:

 
-  | all   | Left-justify the result of this conversion. 

Cosa succede se voglio pad non con gli spazi, ma con qualche altro personaggio?

Il codice Ruby sottostante è scritto in C, ed è hard-coded per usare ' ' come il carattere di riempimento, in modo che non è possibile direttamente, a meno che non si desidera modificare il sorgente, ricompilare il Ruby, e vivere con un versione unica della lingua. Invece, si può fare qualcosa di simile:

 
[17] (pry) main: 0> ('%-3.3s' % 'f').gsub(' ', '.') 
=> "f.." 

Questo diventa molto più complicato di una semplice gsub però. Spesso è meglio regolare la stringa senza utilizzare le stringhe di formato se è necessario fornire caratteri speciali. Le stringhe di formato sono molto potenti ma non sono totalmente flessibili.

Altrimenti, sceglierei qualcosa come la soluzione di @ steenslag, che è la base su cui basare il proprio. Perdi la possibilità di utilizzare le stringhe di formato e devi fare affidamento sul concatenare le tue stringhe o qualcosa di simile per ottenere l'output colonnare, ma funzionerà anche.

+0

classica risposta :) – fl00r

+0

Grazie. Sospettavo che dovesse esserci un modo elegante. Cosa succede se voglio eseguire il rilievo non con spazi ma con qualche altro personaggio? – Paul

+1

Di per sé, 'sprintf' AKA' format' AKA '%' non supporta l'uso di caratteri pad alternativi, ma ci sono modi per aggirarlo. Puoi usare 'tr' o' gsub' per sostituire i caratteri del pad, a seconda che tu stia eseguendo il pad iniziale/finale o se hai spazi incorporati. –

1

Se si sta parlando di un metodo per troncare le stringhe avrei fatto il check out ActionView::Helpers::TextHelper#truncate

Dagli esempi:

truncate("Once upon a time in a world far far away") 

# => Once upon a time in a world... 
+0

Sto andando avanti per testare questa variante, ma non ho potuto usare TextHelper. Come fare questo nel modo giusto (che richiede ho bisogno)? Sto usando Ruby 1.9.3p194. – Paul

25

Per effettuare una stringa di lunghezza fissa più corta:

str_var.slice(1..10) 

Per rendere una stringa una lunghezza fissa più lunga:

str_var.ljust(10, ' ') 

che potevano essere combinati in qualcosa di simile:

(str_var.length > 10) ? str_var.slice(1..10) : str_var.ljust(10, ' ') 

Dove str_var è, naturalmente, la stringa

+0

grazie, non sapeva di "ljust' –

8
class String 
    def fix(size, padstr=' ') 
    self[0...size].rjust(size, padstr) #or ljust 
    end 
end 

p 'lettersletters'.fix(9) #=> "lettersle" 
p 'letters'.fix(10, '.') #=> "...letters" 

Combina il metodo slice (il []) con rjust.

3

Per un puro rubino uno di linea si potrebbe fare questo:

(str + ' ' * length)[0,length] 

che produrrà:

str = "Hello" 
length = 10 
=> "Hello  " 

o:

str = "Hello" 
length = 2 
=> "He" 
Problemi correlati