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

私はレールを使用するので、.nil? || .empty?to.blank?を減らして最後のものをもう少し簡潔にすることができますが、もっと良い方法があると思わずにはいられません。

4

4 に答える 4

9

Rails を使用しているため、以下にアクセスできますString#squish

ビシャビシャ押しつぶす()

最初に文字列の両端のすべての空白を削除し、次に残りの連続する空白グループをそれぞれ 1 つのスペースに変更して、文字列を返します。

だからあなたはこれを行うことができます:

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 に答える