1

我想从titlefirst_namemiddle_name和生成全名last_name。例如比利·鲍勃·桑顿先生。但是titleandmiddle_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?的 to.blank?以使最后一个更简洁,但我不禁认为有更好的方法。

4

4 回答 4

9

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

挤压()

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

所以你可以这样做:

name = "#{title} #{first_name} #{middle_name} #{last_name}".squish
于 2012-08-13T03:01:37.217 回答
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"

泛化到一个函数应该很容易。

于 2012-08-13T02:51:22.357 回答
2

你会寻找这样的东西吗?

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

带导轨

[title, first_name, middle_name, last_name].select(&:present?).join(' ')
于 2012-08-13T02:51:35.393 回答
0
[title, first_name, middle_name, last_name].select({|v| v.present?}).join(' ')
于 2012-08-13T02:51:46.210 回答