2013-04-03 80 views
1

我在我的Ruby模型下面的方法:紅寶石:在過去的數字符分割字符串

老:

def to_s 
    numbers = self.title.scan(/\d+/) if self.title.scan(/\d+/) 
    return numbers.join.insert(0, "#{self.title.chop} ") if numbers 

    "#{self.title.titlecase}" 
    end 

新:

def to_s 
    numbers = self.title.scan(/\d+/) 
    return numbers.join.insert(0, "#{self.title.sub(/\d+/, '')} ") if numbers.any? 

    self.title.titlecase 
    end 

一個title可以像這樣: Level1或TrackStar

所以TrackStar應該成爲Track Star和Level1應該是Level 1,這就是爲什麼我做了掃描的數字與

我試圖像1級以上的作品顯示它開始,我只是好奇,想知道是否有一個更雄辯的解決方案

+0

是數字總是最後一個字符?那裏總是有一個數字? – texasbruce 2013-04-03 19:27:36

+0

@texasbruce - 是的,最後一個字符總是最後一個數字 – dennismonsewicz 2013-04-03 19:30:09

+0

'「#{self.title.titlecase}」'無緣無故地引用它。這可能應該是'self.title.titlecase',或者如果你擔心創建一個重複的字符串,那麼'self.title.titlecase.dup'。 – tadman 2013-04-03 19:30:27

回答

4

試試這個:

def to_s 
    self.title.split(/(?=[0-9])/, 2).join(" ") 
end 

的第二個參數split是確保像「Level10」標題沒有得到轉變爲「1級0」。

編輯 - 以詞之間加空格爲好,我會使用gsub

def to_s 
    self.title.gsub(/([a-z])([A-Z])/, '\1 \2').split(/(?=\d)/, 2).join(" ") 
end 

一定要在第二個參數使用單引號gsub

+0

丹尼斯'解決方案實際返回'「Level1 1」'輸入'「Level10」';-) – 2013-04-03 19:26:03

+0

爲什麼'[0-9]'而不是'\ d'? – tadman 2013-04-03 19:30:53

+0

只是爲了與問題保持一致(如最初發布的那樣)。 – 2013-04-03 19:41:55

1

如何:

'Level1'.split(/(\d+)/).join(' ') 
#=> "Level 1" 
+0

根據@ WallyAltman的觀點 - 如果該號碼有多個數字,則無法正常工作。 – PinnyM 2013-04-03 19:26:23

+0

你是對的,將正則表達式修改爲'\ d +'而不是'\ d'。 Althoug它仍然不匹配_last_發生。 – 2013-04-03 19:36:50