2013-09-27 48 views
5

Tôi có hai dây:Truncate chuỗi khi nó quá dài

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

Tôi muốn thay đổi hành vi mặc định của print tới:

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

Các long_string được in chỉ một phần. Tôi đã cố gắng thay đổi String#to_s, nhưng nó không hoạt động. Có ai biết làm thế nào để làm điều đó như thế này?

cập nhật

Trên thực tế tôi muốn nó hoạt động trơn tru, có nghĩa là các trường hợp sau đây cũng hoạt động tốt:

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

Vì vậy, tôi nghĩ rằng hành vi thuộc về String.

Cảm ơn mọi người.

Trả lời

9

Đây là cách Ruby on Rails thực hiện trong phương thức String#truncate của chúng.

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 

Sau đó, bạn có thể sử dụng nó như thế này

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

Và vâng. Nó được thêm vào Railsmonkey-patch. Vì vậy, thực hiện nó như thế này:

class String 
    def truncate.. 
    end 
end 
3

Bạn có thể viết một wrapper xung quanh puts để xử lý cắt ngắn cho bạn:

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

Đã khắc phục một số sự cố với mã. – kristinalim

+1

Nó trả về 'nil' khiến nó khó kiểm tra hơn một chút. Nó có lẽ chỉ cần trả lại một chuỗi cắt ngắn. – vgoff

+0

Câu trả lời được cập nhật để trả về chuỗi bị cắt ngắn, như @vgoff đề xuất. – kristinalim

11

Trước hết, bạn cần một phương pháp để truncate một chuỗi, hoặc là một cái gì đó như:

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

Hoặc bằng cách mở rộng String:

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

Bây giờ bạn có thể gọi truncate khi in chuỗi:

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

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

Hoặc bạn chỉ có thể xác định riêng của bạn puts:

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, ... 

Lưu ý rằng Kernel#puts mất một số biến của tham số, bạn có thể muốn để thay đổi phương thức puts của bạn cho phù hợp.

0

Truncate một cách tự nhiên

Tôi muốn đề xuất một giải pháp mà truncates một cách tự nhiên. Tôi đã yêu thích số String#truncate method được cung cấp bởi Ruby on Rails. Nó đã được đề cập bởi @Oto Brglez ở trên. Thật không may tôi không thể viết lại nó cho ruby ​​tinh khiết. Vì vậy, tôi đã viết chức năng này.

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 

Ví dụ

  • kiểm tra: Tôi là một cụm từ mẫu để hiển thị các kết quả của chức năng này.
  • KHÔNG: Tôi là một cụm từ mẫu để hiển thị các kết quả của lần thứ ...
  • NHƯNG: Tôi là một cụm từ mẫu để hiển thị các kết quả của ...

Lưu ý: Tôi mở cho cải tiến vì tôi tin rằng có một giải pháp ngắn hơn có thể.

Các vấn đề liên quan