From 9ead8a64e135d88611c0a1a791bad1c5aa1e4439 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Tue, 17 Oct 2023 12:05:10 +0100 Subject: [PATCH] fix:timedot: parse unitful quantities more accurately (fix #2096) A quantity with a unit like "15m" was being parsed internally as 0.249999999... rather than 0.25 (and since hledger 1.21, printed that way also). Now we round such quantities to two places during parsing, to get exact quarter-hour amounts. --- hledger-lib/Hledger/Read/TimedotReader.hs | 3 ++- hledger/test/timedot.test | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/hledger-lib/Hledger/Read/TimedotReader.hs b/hledger-lib/Hledger/Read/TimedotReader.hs index c8b870ae4..8a8b189f6 100644 --- a/hledger-lib/Hledger/Read/TimedotReader.hs +++ b/hledger-lib/Hledger/Read/TimedotReader.hs @@ -52,6 +52,7 @@ import Text.Megaparsec.Char import Hledger.Data import Hledger.Read.Common hiding (emptyorcommentlinep) import Hledger.Utils +import Data.Decimal (roundTo) --- ** doctest setup -- $setup @@ -228,7 +229,7 @@ numericquantityp = do let q' = case msymbol of Nothing -> q - Just sym -> + Just sym -> roundTo 2 $ case lookup sym timeUnits of Just mult -> q * mult Nothing -> q -- shouldn't happen.. ignore diff --git a/hledger/test/timedot.test b/hledger/test/timedot.test index 1c219a4cc..f57a9e829 100644 --- a/hledger/test/timedot.test +++ b/hledger/test/timedot.test @@ -42,3 +42,18 @@ $ hledger -ftimedot:- reg # 3. Tags are recognised. Account aliases are applied. $ hledger -ftimedot:- reg tag:posting-tag --alias fos:haskell=λ 2023-01-01 different transac.. (λ) 1.00 1.00 + +# 4. Each of these formats is printed as exactly a quarter hour. +< +2023-01-01 +a . +b 0.25 +c 15m + +$ hledger -ftimedot:- print +2023-01-01 * + (a) 0.25 + (b) 0.25 + (c) 0.25 + +>=