在Ruby中格式化全名的最简洁方法是什么?

时间:2012-08-13 02:40:28

标签: ruby-on-rails ruby

我想从titlefirst_namemiddle_namelast_name生成全名。例如比利鲍勃桑顿先生。但titlemiddle_name是可选的,我不想获得任何前导或双重空格。我想出了很多方法,但没有一个看起来很优雅。到目前为止,这是我的技术

full_name = "#{title} #{first_name} #{middle_name} #{last_name}"
#FAIL. Leading and double spaces result

full_name = "#{title} #{first_name} #{middle_name} #{last_name}".gsub(/^ /,'').gsub(/  /,' ')
#Works but all that regex tacked on the end is very ugly

full_name = "#{title}#{title.nil? || title.empty? ? '' : ' '}#{first_name} #{middle_name}#{middle_name.nil? || middle_name.empty? ? '' : ' '}#{last_name}"
#Works but goes on forever

我将使用rails,因此可以将.nil? || .empty?缩减为.blank?,使最后一个更简洁,但我不禁认为有更好的方式。

4 个答案:

答案 0 :(得分:8)

您正在使用Rails,因此您可以访问String#squish

  

<强>挤气()

     

返回字符串,首先删除字符串两端的所有空格,然后将剩余的连续空白组分别更改为一个空格。

所以你可以这样做:

name = "#{title} #{first_name} #{middle_name} #{last_name}".squish

答案 1 :(得分:2)

查看Ruby的String#squeezeString#strip

>> title=""
=> ""
>> first_name="Alice"
=> "Alice"
>> middle_name=""
=> ""
>> last_name=""
=> ""
>> full_name = "#{title} #{first_name} #{middle_name} #{last_name}".squeeze(" ").strip
=> "Alice"
>> last_name="Wu"
=> "Wu"
>> full_name = "#{title} #{first_name} #{middle_name} #{last_name}".squeeze(" ").strip
=> "Alice Wu"

对函数进行泛化应该非常简单。

答案 2 :(得分:2)

你会找这样的东西吗?

[title, first_name, middle_name, last_name].compact.reject(&:empty?).join(' ')

使用Rails

[title, first_name, middle_name, last_name].select(&:present?).join(' ')

答案 3 :(得分:0)

[title, first_name, middle_name, last_name].select({|v| v.present?}).join(' ')