2013-02-05 10 views
35

Jak wymusić na wyjściu zmienną ciąg zmienny z Ruby używając puts na n znaków, aby w przypadku dłuższej wartości była ona obcięta, a jeśli jest krótsza, zostanie rozszerzona o spacje końcowe lub końcowe?Jak wymusić łańcuch Ruby na n znaków?

Czy jest jakiś standardowy sposób, aby to zrobić?

Odpowiedz

49

Ruby obsługuje używając ciągi formatu, podobnie jak wielu innych językach:

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

Jeśli chcesz pad w prawo, wykorzystują - w ciągu formatu:

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

Można również użyć printf lub sprintf, ale wolę bardziej ogólny %, który jest podobny do sprintf.

Z sprintf docs:

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

oraz:

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

Co jeśli chcę pad nie spacjami, ale z jakiegoś innego znaku?

Podstawowa kod Ruby jest napisany w C, i to jest zakodowane w użyciu ' ' jako znak pad, więc nie jest to możliwe bezpośrednio, chyba że chcesz zmodyfikować źródła, przekompilować Ruby i żyć z jednorazowa wersja tego języka. Zamiast tego można zrobić coś takiego:

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

dostaje to o wiele bardziej skomplikowane niż proste gsub chociaż. Często lepiej jest dopasować ciąg bez użycia ciągów formatujących, jeśli potrzebujesz znaków specjalnych. Ciągi formatujące są bardzo potężne, ale nie są całkowicie elastyczne.

W przeciwnym razie skorzystałbym z czegoś w rodzaju rozwiązania @ steenslag, które jest podstawą do rozwijania własnych. Tracisz możliwość korzystania z ciągów formatów i musisz polegać na łączeniu łańcuchów lub czegoś podobnego, aby uzyskać kolumny wyjściowe, ale będzie również działać.

+0

klasyczną odpowiedź :) – fl00r

+0

dziękuję. Podejrzewałem, że powinien istnieć jakiś elegancki sposób. Co zrobić, jeśli nie chcę wstawiać spacji, ale z inną postacią? – Paul

+1

Same, 'sprintf' AKA' format' AKA '%' nie obsługuje używania alternatywnych znaków padowych, ale istnieją sposoby obejścia tego. Możesz użyć 'tr' lub' gsub' do zastąpienia znaków pad, w zależności od tego, czy wyprowadzasz dopełnienie wiodące/końcowe, czy też masz osadzone spacje. –

1

Jeśli mówimy o metodzie obciąć ciągi chciałbym sprawdzić ActionView::Helpers::TextHelper#truncate

Z przykładów:

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

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

Piszę do przodu, aby przetestować ten wariant, ale nie mogę użyć TextHelper. Jak to zrobić we właściwy sposób (co jest potrzebne)? Używam Ruby 1.9.3p194. – Paul

25

Aby ciąg stałą długość krótszy:

str_var.slice(1..10) 

Aby utworzyć ciąg o stałej długości dłuższy:

str_var.ljust(10, ' ') 

Oni mogą być połączone w coś takiego:

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

Gdzie str_var jest, oczywiście, Twojego ciąg

+0

dzięki, nie wiedziałem o "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" 

Łączy sposób, ([]) slice z rjust.

3

Dla czystego Ruby jednej wkładki może to zrobić:

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

Który przyniesie:

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

lub:

str = "Hello" 
length = 2 
=> "He" 
Powiązane problemy