Se ti preoccupavi delle prestazioni (e non sto suggerendo di farlo), l'approccio basato sul tentativo è il chiaro vincitore (rispetto all'approccio basato sulla partizione o all'approccio regexp), purché non ti aspetti molto stringhe non valide, nel qual caso è potenzialmente più lenta (presumibilmente a causa del costo della gestione delle eccezioni).
Ancora una volta, non sto suggerendo che ti interessi delle prestazioni, ti do solo i dati nel caso in cui lo fai 10 miliardi di volte al secondo, o qualcosa del genere. Inoltre, il codice basato su partizioni non gestisce almeno una stringa valida.
$ ./floatstr.py
F ..
partizione triste: 3.1102449894
partizione felice: 2.09208488464
..
re triste: 7.76906108856
ri felice: 7.09421992302
..
prova triste: 12.1525540352
prova felice: 1.44165301323
.
================================================== ====================
FAIL: test_partition (__main __. ConvertTests)
-------------------------------------------------- --------------------
Traceback (ultima chiamata più recente):
File "./floatstr.py", riga 48, in test_partition
self.failUnless (is_float_partition ( "20e2"))
AssertionError
-------------------------------------------------- --------------------
Ho eseguito 8 test in 33.670s
FAILED (guasti = 1)
Ecco il codice (Python 2.6, regexp tratto dalla risposta di John Gietzen ):
def is_float_try(str):
try:
float(str)
return True
except ValueError:
return False
import re
_float_regexp = re.compile(r"^[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?$")
def is_float_re(str):
return re.match(_float_regexp, str)
def is_float_partition(element):
partition=element.partition('.')
if (partition[0].isdigit() and partition[1]=='.' and partition[2].isdigit()) or (partition[0]=='' and partition[1]=='.' and pa\
rtition[2].isdigit()) or (partition[0].isdigit() and partition[1]=='.' and partition[2]==''):
return True
if __name__ == '__main__':
import unittest
import timeit
class ConvertTests(unittest.TestCase):
def test_re(self):
self.failUnless(is_float_re("20e2"))
def test_try(self):
self.failUnless(is_float_try("20e2"))
def test_re_perf(self):
print
print 're sad:', timeit.Timer('floatstr.is_float_re("12.2x")', "import floatstr").timeit()
print 're happy:', timeit.Timer('floatstr.is_float_re("12.2")', "import floatstr").timeit()
def test_try_perf(self):
print
print 'try sad:', timeit.Timer('floatstr.is_float_try("12.2x")', "import floatstr").timeit()
print 'try happy:', timeit.Timer('floatstr.is_float_try("12.2")', "import floatstr").timeit()
def test_partition_perf(self):
print
print 'partition sad:', timeit.Timer('floatstr.is_float_partition("12.2x")', "import floatstr").timeit()
print 'partition happy:', timeit.Timer('floatstr.is_float_partition("12.2")', "import floatstr").timeit()
def test_partition(self):
self.failUnless(is_float_partition("20e2"))
def test_partition2(self):
self.failUnless(is_float_partition(".2"))
def test_partition3(self):
self.failIf(is_float_partition("1234x.2"))
unittest.main()