воскресенье, 29 декабря 2013 г.

Python добавление разделителей разрядов в числах

Задача: имеем на входе строку, слова в которой разделены пробелом. Если в строке попадается число, то вставляем точки как разделители разрядов. На выходе нужно получить строку.
Например: text =

'123456' => '123.456'
'333' => '333'
'9999999' => '9.999.999'
'123456 567890' => '123.456 567.890'
'price is 5799' => 'price is 5.799'
'he was born in 1966th' => 'he was born in 1966th'


# разбиваем строку на список
lst = text.split(' ')
out_lst = []
for x in lst:
    if x.isdigit():  
# преобразуем число в список из букв, переворачиваем  
# чтобы добавлять "." с конца списка        
        rev_x = list(str(x))
        rev_x.reverse()            
# так как будем добавлять "." длина списка увеличится,
# то добавлять будем в новый список
        y = []
        for i in xrange(0, len(list(str(x)))):
# после каждого третьего символа добавляем "."    
            if i % 3 == 0 and i > 0:        
                y.append('.')
            y.append(rev_x[i])
        y.reverse() 
# вывод строки как результат сложения элементов списка      
        out_lst.append(reduce(lambda n,m: n + m, y))        
    else:
        out_lst.append(x)
# преобразование из списка со строками в одну строку
text = ' '.join(out_lst)

Лучшее решение
import re
re.sub(r'(?<=\d)(?=(\d\d\d)+\b)', '.', str(text))

И еще вариант
txt = 'he was born in 123456789'
words = txt.split()
for word in words:
    if word.isdigit():
        new_word = '.'.join([word[::-1][i*3:(i+1)*3]
                             for i in range(((len(word) - 1) // 3) + 1)])
        txt = txt.replace(word, new_word[::-1])
print txt


he was born in 123.456.789

Комментариев нет:

Отправить комментарий