Removendo caracteres com o método trim no Ruby

02/08/07

Já precisou remover caracteres de uma string, com funções semelhantes a trim, rtrim e ltrim do PHP? Pois é! No Ruby você não tem isso nativamente. Para adicionar tais funcionalidades, basta estender a classe String com os métodos abaixo.

class String
  def trim!(chars)
    rtrim!(chars)
    ltrim!(chars)
  end
 
  def rtrim!(chars)
    gsub!(/(#{trim_prepare(chars)})+$/, '')
  end
 
  def ltrim!(chars)
    gsub!(/^(#{trim_prepare(chars)})+/, '')
  end
 
  def trim(chars)
    dup.rtrim(chars).ltrim(chars)
  end
 
  def rtrim(chars)
    dup.rtrim!(chars)
  end
 
  def ltrim(chars)
    dup.ltrim!(chars)
  end
 
  private
    def trim_prepare(chars)
      chars = chars.split("").collect { |char| Regexp.escape(char) }
      chars.join('|')
    end
end

Seu funcionamento é muito semelhante às funções do PHP. Veja:

text = '|_ ruby _|'
puts text.trim(' _|')  # both sides
puts text.ltrim(' _|') # left side
puts text.rtrim(' _|') # right side

Lembre-se que você não precisa passar os caracteres que serão removidos na ordem em que eles aparecem.

Formatando a duração de uma música em milisegundos

27/07/07

Imagine que, por algum motivo, você precise formatar a duração de uma música de milisegundos para "0:00". Com o Ruby é moleza:

module Duration
  def to_duration
    total_secs = self / 1000.0
    mins = (total_secs / 60.0).to_i
    secs = (total_secs - mins*60).to_i
    "%d:%02d" % [mins, secs]
  end
end 
 
class Fixnum; include Duration; end
class Bignum; include Duration; end
class Float; include Duration; end
 
puts (68*1000).to_duration  # 1:08
puts (120*1000).to_duration # 2:00
puts (235*1000).to_duration # 3:55

Só não me pergunte para que precisei disso! :)

Workshop de Ruby na ObjectTraining

03/07/07

No dia 17 de julho irá acontecer o workshop Impressão de cupom fiscal com Ruby, na ObjectTraining, com Alexandre Riveira. A ObjectTraining oferece treinamentos de Ruby — com o TaQ — e Ruby on Rails — com o Ronie Uliana.

Apesar de não ter nenhuma utilidade prática para mim no momento, me inscrevi para ver como é! Se você for aparecer por lá, me chama para bater um papo! ;)