如何在字符串末尾的多个位置插入char

时间:2015-09-09 17:18:55

标签: ruby string algorithm

像这样输入:

100000000
1000
100
100000
10000

我需要从string的结尾开始插入char(,),从结束后的三个char开始插入,然后在每2个char之后重复插入(,)

输出

10,00,00,000
1,000
100
1,00,000
10,000

任何提示家伙我怎么能这样做,我需要从字符串的末尾开始插入char(',')。

谢谢!

2 个答案:

答案 0 :(得分:3)

这里有两种方法,第一种是使用正则表达式,最后一种只是在循环中插入逗号。

a = %w| 100000000 1000 100 100000 10000 |
  #=> ["100000000", "1000", "100", "100000", "10000"]

#1使用正则表达式

r = /
    (?<=\d)    # match digit in positive lookbehind
    \d{2}      # match two digits
    (?=        # begin positive lookahead
    (?:\d{2})* # match two digits, repeated zero or more times
    \d         # match last digit
    \z         # match end of string
    )          # end positive lookahead
    /x         # extended mode

a.each { |s| puts "#{s} -> #{ s.gsub(r) { |ss| ',' + ss } }" }
100000000 -> 10,00,00,000
1000 -> 1,000
100 -> 100
100000 -> 1,00,000
10000 -> 10,000

这个正则表达式与@Avinish早先给出的类似,但我选择使用正面的lookbehind而不是捕获组,并以扩展模式呈现它以帮助读者理解它是如何工作的。我会在这里使用正则表达式。

#2插入逗号

如果您不想使用正则表达式,可以确定要插入的最后一个逗号的位置(下面是p),要插入的逗号数(下面是n)然后插入它们,回到前面:

def insert_commas(string)
  sz = string.size
  str = string.dup
  p = sz - 3
  n = (sz - 2)/2
  n.times { str.insert(p, ','); p -= 2 }
  str
end

a.each { |s| puts "#{s} -> #{insert_commas(s)}" }
100000000 -> 10,00,00,000
1000 -> 1,000
100 -> 100
100000 -> 1,00,000
10000 -> 10,000

dup编辑string假设你不想改变string

可替换地,

def insert_commas(string)
  sz = string.size
  return string if sz < 4
  p = sz.even? ? 1 : 2
  string[0,p] + string[p..-2].gsub(/\d{2}/) { |s| ",#{s}" } + string[-1]
end

答案 1 :(得分:1)

使用以下正向前瞻性正则表达式。

gsub(/(\d)(?=(?:\d{2})*\d{3}$)/, "$1,")

DEMO