diff --git a/src/parsetoml.nim b/src/parsetoml.nim index 8993d64..65ef7ef 100644 --- a/src/parsetoml.nim +++ b/src/parsetoml.nim @@ -36,6 +36,8 @@ import streams import strutils import tables import unicode +from parseutils import parseFloat + export tables when (NimMajor, NimMinor, NimPatch) < (1, 4, 0): @@ -271,9 +273,9 @@ proc parseEncoding(state: var ParserState): TomlValueRef = proc parseDecimalPart(state: var ParserState): float64 = var nextChar: char - invPowerOfTen = 10.0 firstPos = true wasUnderscore = false + decimalPartStr = "0." result = 0.0 while true: @@ -293,11 +295,11 @@ proc parseDecimalPart(state: var ParserState): float64 = raise newTomlError(state, "decimal part empty") break - result = result + (int(nextChar) - int('0')).float / invPowerOfTen - invPowerOfTen *= 10 + decimalPartStr.add(nextChar) firstPos = false - + doAssert decimalPartStr.len > 2 # decimalPartStr shouldn't still be "0." at this point + discard parseutils.parseFloat(decimalPartStr, result) proc stringDelimiter(kind: StringType): char {.inline, noSideEffect.} = result = (case kind diff --git a/tests/test1.nim b/tests/test1.nim index 5de12e3..b234d18 100644 --- a/tests/test1.nim +++ b/tests/test1.nim @@ -95,3 +95,7 @@ file_name = "test.txt" tomlRef.setEmptyTableVal() check: tomlRef.kind == TomlValueKind.Table + +suite "bug fixes": + test "issue-45": + check $("some_float = 0.123".parseString()["some_float"].getFloat()) == "0.123"