結局「他で余計な処理を加えず」「一つだけで」という条件だと、 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