2015-09-09 1 views
0

ввода, например так:, как вставить символ при многократном положении от конца строки

100000000 
1000 
100 
100000 
10000 

я должен начать вставку символа (,) от конца string.first времени после того, как три полукокса от конца, а затем повторить вставку (,) после каждого 2 гольца

выхода

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

любого намека, ребятам, как я могу это сделать, мне нужно, чтобы начать вставлять символ («») от конца строки.

спасибо!

+1

Дайте правила. – sawa

+0

Что такое «инертный»? Как «тег (,)» и «char (',')« различны? – sawa

ответ

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, но я решил использовать положительный и не 'назад группа захвата, и представил его в расширенном режиме, чтобы помочь читателям понять, как это работает. Я бы использовал здесь регулярное выражение.

# 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

Используйте приведенное ниже позиционное регулярное выражение.

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

DEMO

+1

Вы можете использовать lookbehind, чтобы избавиться от '$ 1'. – sawa

+0

Как подходит символ новой строки? – sawa

+0

или '(? <= \ D) (? = (?: \ D {2}) * \ d {3} $)' заменить ',' –

Смежные вопросы