Skip to content

Commit 7557fbb

Browse files
committed
Add parsing FixedDecimal from string
1 parent 5ea6938 commit 7557fbb

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

src/FixedPointDecimals.jl

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ using Compat
2929

3030
import Base: reinterpret, zero, one, abs, sign, ==, <, <=, +, -, /, *, div,
3131
rem, divrem, fld, mod, fldmod, fld1, mod1, fldmod1, isinteger,
32-
typemin, typemax, realmin, realmax, print, show, string, convert,
32+
typemin, typemax, realmin, realmax, print, show, string, convert, parse,
3333
promote_rule, min, max, trunc, round, floor, ceil, eps, float, widemul
3434

3535
const IEEEFloat = Union{Float16, Float32, Float64}
@@ -292,4 +292,18 @@ function show{T, f}(io::IO, x::FD{T, f})
292292
end
293293
end
294294

295+
# parsing
296+
function parse{T, f}(::Type{FD{T, f}}, str::AbstractString)
297+
dp = findfirst(str, '.')
298+
if dp > 0
299+
int_str = str[1:(dp - 1)] * str[(dp + 1):min(dp + f, end)]
300+
len = dp + f - 1
301+
else
302+
int_str = str
303+
len = length(str) + f
304+
end
305+
val = parse(T, rpad(int_str, len, '0'))
306+
reinterpret(FD{T, f}, val)
307+
end
308+
295309
end

test/runtests.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,4 +412,20 @@ end
412412
end
413413
end
414414

415+
@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)
429+
end
430+
415431
end # global testset

0 commit comments

Comments
 (0)