Skip to content

Commit ee8aa0f

Browse files
committed
Support parsing scientific notation
1 parent 7557fbb commit ee8aa0f

File tree

2 files changed

+45
-17
lines changed

2 files changed

+45
-17
lines changed

src/FixedPointDecimals.jl

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -294,15 +294,27 @@ end
294294

295295
# parsing
296296
function parse{T, f}(::Type{FD{T, f}}, str::AbstractString)
297+
# parse exponent information
298+
ex = findfirst(str, 'e')
299+
if ex > 0
300+
pow = parse(Int, str[(ex + 1):end])
301+
ending = ex - 1
302+
else
303+
pow = 0
304+
ending = length(str)
305+
end
306+
307+
# Remove the decimal place from the string
297308
dp = findfirst(str, '.')
298309
if dp > 0
299-
int_str = str[1:(dp - 1)] * str[(dp + 1):min(dp + f, end)]
310+
int_str = str[1:(dp - 1)] * str[(dp + 1):min(dp + f, ending)]
300311
len = dp + f - 1
301312
else
302-
int_str = str
303-
len = length(str) + f
313+
int_str = str[1:ending]
314+
len = ending + f
304315
end
305-
val = parse(T, rpad(int_str, len, '0'))
316+
317+
val = parse(T, rpad(int_str, len + pow, '0'))
306318
reinterpret(FD{T, f}, val)
307319
end
308320

test/runtests.jl

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -413,19 +413,35 @@ end
413413
end
414414

415415
@testset "parse" begin
416-
@test parse(FD2, "123") == reinterpret(FD2, 12300)
417-
@test parse(FD2, ".123") == reinterpret(FD2, 12)
418-
@test parse(FD2, "1.23") == reinterpret(FD2, 123)
419-
@test parse(FD2, "12.3") == reinterpret(FD2, 1230)
420-
@test parse(FD2, "123.") == reinterpret(FD2, 12300)
421-
422-
@test parse(FD2, "-123") == reinterpret(FD2, -12300)
423-
@test parse(FD2, "-.123") == reinterpret(FD2, -12)
424-
@test parse(FD2, "-1.23") == reinterpret(FD2, -123)
425-
@test parse(FD2, "-12.3") == reinterpret(FD2, -1230)
426-
@test parse(FD2, "-123.") == reinterpret(FD2, -12300)
427-
428-
@test parse(FD2, "2.3") == reinterpret(FD2, 230)
416+
# Note: the underscore used in the reinterpreted integer is used to indicate the decimal
417+
# place.
418+
@test parse(FD2, "123") == reinterpret(FD2, 123_00)
419+
@test parse(FD2, ".123") == reinterpret(FD2, 0_12)
420+
@test parse(FD2, "1.23") == reinterpret(FD2, 1_23)
421+
@test parse(FD2, "12.3") == reinterpret(FD2, 12_30)
422+
@test parse(FD2, "123.") == reinterpret(FD2, 123_00)
423+
424+
@test parse(FD2, "-123") == reinterpret(FD2, -123_00)
425+
@test parse(FD2, "-.123") == reinterpret(FD2, -0_12)
426+
@test parse(FD2, "-1.23") == reinterpret(FD2, -1_23)
427+
@test parse(FD2, "-12.3") == reinterpret(FD2, -12_30)
428+
@test parse(FD2, "-123.") == reinterpret(FD2, -123_00)
429+
430+
@test parse(FD4, "12e0") == reinterpret(FD4, 00012_0000)
431+
@test parse(FD4, "12e3") == reinterpret(FD4, 12000_0000)
432+
@test parse(FD4, "12e-3") == reinterpret(FD4, 00000_0120)
433+
@test parse(FD4, "1.2e0") == reinterpret(FD4, 00001_2000)
434+
@test parse(FD4, "1.2e3") == reinterpret(FD4, 01200_0000)
435+
@test parse(FD4, "1.2e-3") == reinterpret(FD4, 00000_0012)
436+
437+
@test parse(FD4, "-12e0") == reinterpret(FD4, -00012_0000)
438+
@test parse(FD4, "-12e3") == reinterpret(FD4, -12000_0000)
439+
@test parse(FD4, "-12e-3") == reinterpret(FD4, -00000_0120)
440+
@test parse(FD4, "-1.2e0") == reinterpret(FD4, -00001_2000)
441+
@test parse(FD4, "-1.2e3") == reinterpret(FD4, -01200_0000)
442+
@test parse(FD4, "-1.2e-3") == reinterpret(FD4, -00000_0012)
443+
444+
@test parse(FD2, "2.3") == reinterpret(FD2, 2_30)
429445
end
430446

431447
end # global testset

0 commit comments

Comments
 (0)