Merge pull request #4188 from Parashurama/improve_float_parsing
fixes some issues with underscores in float literals. add more tests.
This commit is contained in:
commit
366a0df490
3 changed files with 54 additions and 5 deletions
|
|
@ -328,7 +328,7 @@ proc nimParseBiggestFloat(s: string, number: var BiggestFloat,
|
||||||
fraction: uint64
|
fraction: uint64
|
||||||
frac_exponent= 0
|
frac_exponent= 0
|
||||||
exp_sign = 1
|
exp_sign = 1
|
||||||
first_digit = 0
|
first_digit = -1
|
||||||
has_sign = false
|
has_sign = false
|
||||||
|
|
||||||
# Sign?
|
# Sign?
|
||||||
|
|
@ -359,6 +359,7 @@ proc nimParseBiggestFloat(s: string, number: var BiggestFloat,
|
||||||
# Skip leading zero
|
# Skip leading zero
|
||||||
while s[i] == '0':
|
while s[i] == '0':
|
||||||
inc(i)
|
inc(i)
|
||||||
|
while s[i] == '_': inc(i)
|
||||||
|
|
||||||
if s[i] in {'0'..'9'}:
|
if s[i] in {'0'..'9'}:
|
||||||
first_digit = (s[i].ord - '0'.ord)
|
first_digit = (s[i].ord - '0'.ord)
|
||||||
|
|
@ -366,7 +367,7 @@ proc nimParseBiggestFloat(s: string, number: var BiggestFloat,
|
||||||
while s[i] in {'0'..'9'}:
|
while s[i] in {'0'..'9'}:
|
||||||
inc(kdigits)
|
inc(kdigits)
|
||||||
integer = integer * 10'u64 + (s[i].ord - '0'.ord).uint64
|
integer = integer * 10'u64 + (s[i].ord - '0'.ord).uint64
|
||||||
inc(i);
|
inc(i)
|
||||||
while s[i] == '_': inc(i)
|
while s[i] == '_': inc(i)
|
||||||
|
|
||||||
# Fractional part?
|
# Fractional part?
|
||||||
|
|
@ -374,11 +375,12 @@ proc nimParseBiggestFloat(s: string, number: var BiggestFloat,
|
||||||
inc(i)
|
inc(i)
|
||||||
# if no integer part, Skip leading zeros
|
# if no integer part, Skip leading zeros
|
||||||
if kdigits <= 0:
|
if kdigits <= 0:
|
||||||
while s[i] in {'_','0'}:
|
while s[i] == '0':
|
||||||
inc(i)
|
|
||||||
inc(frac_exponent)
|
inc(frac_exponent)
|
||||||
|
inc(i)
|
||||||
|
while s[i] == '_': inc(i)
|
||||||
|
|
||||||
if s[i] in {'0'..'9'}:
|
if first_digit == -1 and s[i] in {'0'..'9'}:
|
||||||
first_digit = (s[i].ord - '0'.ord)
|
first_digit = (s[i].ord - '0'.ord)
|
||||||
# get fractional part
|
# get fractional part
|
||||||
while s[i] in {'0'..'9'}:
|
while s[i] in {'0'..'9'}:
|
||||||
|
|
|
||||||
21
tests/float/tfloat6.nim
Normal file
21
tests/float/tfloat6.nim
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
discard """
|
||||||
|
file: "tfloat6.nim"
|
||||||
|
output: '''1e-06 : 1e-06
|
||||||
|
1e-06 : 1e-06
|
||||||
|
0.001 : 0.001
|
||||||
|
1e-06 : 1e-06
|
||||||
|
1e-06 : 1e-06
|
||||||
|
10.000001 : 10.000001
|
||||||
|
100.000001 : 100.000001'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
import strutils
|
||||||
|
|
||||||
|
echo "0.00_0001".parseFloat(), " : ", 1E-6
|
||||||
|
echo "0.00__00_01".parseFloat(), " : ", 1E-6
|
||||||
|
echo "0.0_01".parseFloat(), " : ", 0.001
|
||||||
|
echo "0.00_000_1".parseFloat(), " : ", 1E-6
|
||||||
|
echo "0.00000_1".parseFloat(), " : ", 1E-6
|
||||||
|
|
||||||
|
echo "1_0.00_0001".parseFloat(), " : ", 10.000001
|
||||||
|
echo "1__00.00_0001".parseFloat(), " : ", 1_00.000001
|
||||||
26
tests/float/tfloat7.nim
Normal file
26
tests/float/tfloat7.nim
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
discard """
|
||||||
|
file: "tfloat6.nim"
|
||||||
|
output: '''passed.
|
||||||
|
passed.
|
||||||
|
passed.
|
||||||
|
passed.
|
||||||
|
passed.
|
||||||
|
passed.
|
||||||
|
passed.'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
import strutils
|
||||||
|
template expect_fail(x: expr) =
|
||||||
|
try:
|
||||||
|
discard x
|
||||||
|
echo("expected to fail!")
|
||||||
|
except ValueError:
|
||||||
|
echo("passed.")
|
||||||
|
|
||||||
|
expect_fail("1_0._00_0001".parseFloat())
|
||||||
|
expect_fail("_1_0_00.0001".parseFloat())
|
||||||
|
expect_fail("10.00.01".parseFloat())
|
||||||
|
expect_fail("10.00E_01".parseFloat())
|
||||||
|
expect_fail("10.00E_01".parseFloat())
|
||||||
|
expect_fail("10.00E".parseFloat())
|
||||||
|
expect_fail("10.00A".parseFloat())
|
||||||
Loading…
Add table
Add a link
Reference in a new issue