2013-09-27 25 views
5

Ich habe zwei Strings:Kürzen Zeichenfolge, wenn sie zu lang ist

short_string = "hello world" 
long_string = "this is a very long long long .... string" # suppose more than 10000 chars 

Ich möchte das Standardverhalten von print ändern:

puts short_string 
# => "hello world" 
puts long_string 
# => "this is a very long long....." 

Die long_string nur teilweise gedruckt. Ich habe versucht, String#to_s zu ändern, aber es hat nicht funktioniert. Weiß jemand, wie man das macht?

aktualisiert

Eigentlich funktioniert ich will es glatt, das heißt, arbeiten die folgenden Fälle auch in Ordnung:

> puts very_long_str 
> puts [very_long_str] 
> puts {:a => very_long_str} 

Also ich denke, das Verhalten zu String gehört.

Vielen Dank trotzdem alle.

Antwort

9

Dies ist, wie Ruby on Rails tut es in ihrer String#truncate Methode.

def truncate(truncate_at, options = {}) 
    return dup unless length > truncate_at 

    options[:omission] ||= '...' 
    length_with_room_for_omission = truncate_at - options[:omission].length 
    stop =  if options[:separator] 
     rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission 
    else 
     length_with_room_for_omission 
    end 

    "#{self[0...stop]}#{options[:omission]}" 
end 

Dann können Sie es wie diese

verwenden
'And they found that many people were sleeping better.'.truncate(25, omission: '... (continued)') 
# => "And they f... (continued)" 

Und ja. Es wird zu Rails als monkey-patch hinzugefügt. So wie dieser seine implementiert:

class String 
    def truncate.. 
    end 
end 
3

Sie einen Wrapper um puts schreiben können, die Verkürzung für Sie Griffe:

def pleasant(string, length = 32) 
    raise 'Pleasant: Length should be greater than 3' unless length > 3 

    truncated_string = string.to_s 
    if truncated_string.length > length 
    truncated_string = truncated_string[0...(length - 3)] 
    truncated_string += '...' 
    end 

    puts truncated_string 
    truncated string 
end 
+0

mit dem Code ein paar Probleme behoben. – kristinalim

+1

Es gibt 'nil', die es ein wenig schwieriger zu testen macht. Es sollte wahrscheinlich nur eine abgeschnittene Zeichenfolge zurückgeben. – vgoff

+0

aktualisiert Antwort die abgeschnittene Zeichenfolge zurück, wie @vgoff vorgeschlagen. – kristinalim

11

Zunächst einmal müssen Sie eine Methode, um truncate eine Zeichenfolge, entweder so etwas wie:

def truncate(string, max) 
    string.length > max ? "#{string[0...max]}..." : string 
end 

Oder durch String erstreckt:

class String 
    def truncate(max) 
    length > max ? "#{self[0...max]}..." : self 
    end 
end 

Jetzt können Sie truncate aufrufen, wenn die Zeichenfolge Druck:

puts "short string".truncate 
#=> short string 

puts "a very, very, very, very long string".truncate 
#=> a very, very, very, ... 

Oder Sie könnten nur Ihre eigene puts definieren:

def puts(string) 
    super(string.truncate(20)) 
end 

puts "short string" 
#=> short string 

puts "a very, very, very, very long string" 
#=> a very, very, very, ... 

Beachten Sie, dass Kernel#puts eine variable Anzahl von Argumenten nimmt, möchten Sie vielleicht Ändern Sie Ihre puts Methode entsprechend.

0

Kürzen natürlich

Ich möchte eine Lösung vorzuschlagen, die natürlich abschneidet. Ich verliebte mich in die String#truncate method angeboten von Ruby on Rails. Es wurde bereits von @Oto Brglez oben erwähnt. Leider konnte ich es nicht für reinen Rubin umschreiben. Also habe ich diese Funktion geschrieben.

def truncate(content, max)  
    if content.length > max 
     truncated = "" 
     collector = "" 
     content = content.split(" ") 
     content.each do |word| 
      word = word + " " 
      collector << word 
      truncated << word if collector.length < max 
     end 
     truncated = truncated.strip.chomp(",").concat("...") 
    else 
     truncated = content 
    end 
    return truncated 
end 

Beispiel

  • Test: Ich bin ein Beispielsatz das Ergebnis dieser Funktion zu zeigen.
  • NICHT: Ich bin ein Beispielsatz das Ergebnis th zeigen ...
  • ABER: Ich bin ein Beispielsatz das Ergebnis zu zeigen ...

Hinweis: Ich bin offen für Verbesserungen, weil ich davon überzeugt bin, dass eine kürzere Lösung möglich ist.

Verwandte Themen