[pypy-svn] r13773 - in pypy/dist/pypy/objspace/std: . test

arigo at codespeak.net arigo at codespeak.net
Fri Jun 24 13:06:22 CEST 2005


Author: arigo
Date: Fri Jun 24 13:06:19 2005
New Revision: 13773

Modified:
   pypy/dist/pypy/objspace/std/strutil.py
   pypy/dist/pypy/objspace/std/test/test_strutil.py
Log:
Trivial bug fixes in string_to_float().
Tests.


Modified: pypy/dist/pypy/objspace/std/strutil.py
==============================================================================
--- pypy/dist/pypy/objspace/std/strutil.py	(original)
+++ pypy/dist/pypy/objspace/std/strutil.py	Fri Jun 24 13:06:19 2005
@@ -187,7 +187,7 @@
 
 
 def string_to_float(s):
-    s = strip_space(s)
+    s = strip_spaces(s)
 
     if not s:
         raise ParseStringError("empty string for float()")
@@ -210,12 +210,13 @@
     while i < len(after_point):
         d = float(ord(after_point[i]) - ord('0'))
         r += d * (10.0 ** (-i-1))
+        i += 1
 
     if exponent:
-        e = string_to_int(None, exponent)
+        e = string_to_int(exponent)
         r *= 10.0 ** e
 
-    return r
-        
+    if sign == '-':
+        r = -r
 
-    
+    return r

Modified: pypy/dist/pypy/objspace/std/test/test_strutil.py
==============================================================================
--- pypy/dist/pypy/objspace/std/test/test_strutil.py	(original)
+++ pypy/dist/pypy/objspace/std/test/test_strutil.py	Fri Jun 24 13:06:19 2005
@@ -1,4 +1,5 @@
 import autopath
+import py, random
 from pypy.objspace.std.strutil import *
 
 import py
@@ -146,3 +147,44 @@
     assert break_up_float('e1') == ('', '', '', '1')
 
     py.test.raises(ParseStringError, break_up_float, 'e')
+
+
+def test_string_to_float():
+    assert string_to_float('0') == 0.0
+    assert string_to_float('1') == 1.0
+    assert string_to_float('-1.5') == -1.5
+    assert string_to_float('1.5E2') == 150.0
+    assert string_to_float('2.5E-1') == 0.25
+
+    valid_parts = [['', '  ', ' \f\n\r\t\v'],
+                   ['', '+', '-'],
+                   ['00', '90', '.5', '2.4', '3.', '0.07',
+                    '12.3489749871982471987198371293717398256187563298638726'
+                    '2187362820947193247129871083561249818451804287437824015'
+                    '013816418758104762348932657836583048761487632840726386'],
+                   ['', 'e0', 'E+1', 'E-01', 'E42'],
+                   ['', '  ', ' \f\n\r\t\v'],
+                   ]
+    invalid_parts = [['#'],
+                     ['++', '+-', '-+', '--'],
+                     ['', '1.2.3', '.', '5..6'],
+                     ['E+', 'E-', 'e', 'e++', 'E++2'],
+                     ['#'],
+                     ]
+    for part0 in valid_parts[0]:
+        for part1 in valid_parts[1]:
+            for part2 in valid_parts[2]:
+                for part3 in valid_parts[3]:
+                    for part4 in valid_parts[4]:
+                        s = part0+part1+part2+part3+part4
+                        assert (abs(string_to_float(s) - float(s)) <=
+                                1E-13 * abs(float(s)))
+
+    for j in range(len(invalid_parts)):
+        for invalid in invalid_parts[j]:
+            for i in range(20):
+                parts = [random.choice(lst) for lst in valid_parts]
+                parts[j] = invalid
+                s = ''.join(parts)
+                print repr(s)
+                py.test.raises(ParseStringError, string_to_float, s)



More information about the Pypy-commit mailing list