Вот два способа, первый, используя регулярное выражение, последние просто вставляя запятые в цикле.
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, но я решил использовать положительный и не 'назад группа захвата, и представил его в расширенном режиме, чтобы помочь читателям понять, как это работает. Я бы использовал здесь регулярное выражение.
# 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
Дайте правила. – sawa
Что такое «инертный»? Как «тег (,)» и «char (',')« различны? – sawa