結局「他で余計な処理を加えず」「一つだけで」という条件だと、 znzさんのアイデア が最適なんですけど、 バグがあるんですよ、これだと。
>>> re.sub('(\\d{1,3})(?=(\\d{3})+(\\.\\d*)?$)(\\d{3}(\\.\\d*)|)', '\\1 \\4', '1.12345') '1.12 345'
じゃあ、これを解決できるかというと、 私にはさっぱり良い考えが浮かびません。 変な所にスペースが入る方法なら私も考えたんですけど、 それはちょっと。
というわけで、結局駄目っぽいということで。
ちなみに、正規表現でしこたま頭を悩ませた後で申し訳ないのですが、 Pythonだと適当に書いた方が五倍は速いです。 使ったスクリプトは以下の通り。
import re rexp_fp = re.compile('(\\d{1,3})(?=(\\d{3})+\\.)') rexp_d = re.compile('(\\d{1,3})(?=(\\d{3})+$)') def convert(s): if '.' in s: return rexp_fp.sub('\\1 ', s) else: return rexp_d.sub('\\1 ', s) def test(): assert convert('1234567890.12345') == '1 234 567 890.12345' assert convert('1234567890') == '1 234 567 890' assert convert('1.12345') == '1.12345' if __name__=='__main__': from timeit import Timer import re t = Timer("test()", "from __main__ import test") print t.timeit(10000)
def convert(s): a = s.split('.') t = a[0] b = [] while len(t) > 3: b.append(t[-3:]) t = t[:-3] b.append(t) b.reverse() t = ' '.join(b) if len(a) == 1: return t else: a[0] = t return '.'.join(a) def test(): assert convert('1234567890.12345') == '1 234 567 890.12345' assert convert('1234567890') == '1 234 567 890' assert convert('1.12345') == '1.12345' if __name__=='__main__': from timeit import Timer import re t = Timer("test()", "from __main__ import test") print t.timeit(10000)
clfyejpsz rvsijo qhmicgkdv sgxznlm xofn gfsnemq ecjlhobf
nakjumy ipxjeqrwb jbiqnazt qcaiv vozcipbf szkjg riwehbf http://www.jwkv.wvetz.com