more balance/amount clarifications and a test
This commit is contained in:
parent
9aaf489a38
commit
1273f02a9a
@ -109,6 +109,7 @@ instance Num MixedAmount where
|
|||||||
negate (Mixed as) = Mixed $ map negateAmountPreservingPrice as
|
negate (Mixed as) = Mixed $ map negateAmountPreservingPrice as
|
||||||
where negateAmountPreservingPrice a = (-a){price=price a}
|
where negateAmountPreservingPrice a = (-a){price=price a}
|
||||||
(+) (Mixed as) (Mixed bs) = normaliseMixedAmount $ Mixed $ as ++ bs
|
(+) (Mixed as) (Mixed bs) = normaliseMixedAmount $ Mixed $ as ++ bs
|
||||||
|
-- (+) (Mixed as) (Mixed bs) = normaliseMixedAmountPreservingHighestPrecision $ Mixed $ as ++ bs
|
||||||
(*) = error' "programming error, mixed amounts do not support multiplication"
|
(*) = error' "programming error, mixed amounts do not support multiplication"
|
||||||
abs = error' "programming error, mixed amounts do not support abs"
|
abs = error' "programming error, mixed amounts do not support abs"
|
||||||
signum = error' "programming error, mixed amounts do not support signum"
|
signum = error' "programming error, mixed amounts do not support signum"
|
||||||
|
|||||||
@ -415,6 +415,10 @@ postingsByAccount ps = m'
|
|||||||
groupedps = groupBy (\p1 p2 -> paccount p1 == paccount p2) sortedps
|
groupedps = groupBy (\p1 p2 -> paccount p1 == paccount p2) sortedps
|
||||||
m' = Map.fromList [(paccount $ head g, g) | g <- groupedps]
|
m' = Map.fromList [(paccount $ head g, g) | g <- groupedps]
|
||||||
|
|
||||||
|
-- debug helpers
|
||||||
|
traceAmountPrecision a = trace (show $ map (precision . commodity) $ amounts a) a
|
||||||
|
tracePostingsCommodities ps = trace (show $ map ((map (precision . commodity) . amounts) . pamount) ps) ps
|
||||||
|
|
||||||
tests_Hledger_Data_Journal = TestList [
|
tests_Hledger_Data_Journal = TestList [
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import Hledger.Data.Types
|
|||||||
import Hledger.Utils
|
import Hledger.Utils
|
||||||
import Hledger.Data.Posting
|
import Hledger.Data.Posting
|
||||||
import Hledger.Data.Dates (getCurrentYear)
|
import Hledger.Data.Dates (getCurrentYear)
|
||||||
import Hledger.Data.Journal (nullctx, nulljournal, journalFinalise)
|
import Hledger.Data.Journal
|
||||||
|
|
||||||
|
|
||||||
juSequence :: [JournalUpdate] -> JournalUpdate
|
juSequence :: [JournalUpdate] -> JournalUpdate
|
||||||
|
|||||||
@ -153,32 +153,30 @@ accountsReportItemAsText opts format (_, accountName, depth, Mixed amounts) =
|
|||||||
case amounts of
|
case amounts of
|
||||||
[] -> []
|
[] -> []
|
||||||
[a] -> [formatAccountsReportItem opts (Just accountName) depth a format]
|
[a] -> [formatAccountsReportItem opts (Just accountName) depth a format]
|
||||||
(as) -> asText as
|
(as) -> multiline as
|
||||||
where
|
where
|
||||||
asText :: [Amount] -> [String]
|
multiline :: [Amount] -> [String]
|
||||||
asText [] = []
|
multiline [] = []
|
||||||
asText [a] = [formatAccountsReportItem opts (Just accountName) depth a format]
|
multiline [a] = [formatAccountsReportItem opts (Just accountName) depth a format]
|
||||||
asText (a:as) = (formatAccountsReportItem opts Nothing depth a format) : asText as
|
multiline (a:as) = (formatAccountsReportItem opts Nothing depth a format) : multiline as
|
||||||
|
|
||||||
formatAccountsReportItem :: ReportOpts -> Maybe AccountName -> Int -> Amount -> [FormatString] -> String
|
formatAccountsReportItem :: ReportOpts -> Maybe AccountName -> Int -> Amount -> [FormatString] -> String
|
||||||
formatAccountsReportItem _ _ _ _ [] = ""
|
formatAccountsReportItem _ _ _ _ [] = ""
|
||||||
formatAccountsReportItem opts accountName depth amount (fmt:fmts) =
|
formatAccountsReportItem opts accountName depth amount (fmt:fmts) =
|
||||||
s ++ (formatAccountsReportItem opts accountName depth amount fs)
|
s ++ (formatAccountsReportItem opts accountName depth amount fmts)
|
||||||
where
|
where
|
||||||
s = case fmt of
|
s = case fmt of
|
||||||
FormatLiteral l -> l
|
FormatLiteral l -> l
|
||||||
FormatField ljust min max field -> formatField opts accountName depth amount ljust min max field
|
FormatField ljust min max field -> formatField opts accountName depth amount ljust min max field
|
||||||
|
|
||||||
formatField :: ReportOpts -> Maybe AccountName -> Int -> Amount -> Bool -> Maybe Int -> Maybe Int -> Field -> String
|
formatField :: ReportOpts -> Maybe AccountName -> Int -> Amount -> Bool -> Maybe Int -> Maybe Int -> Field -> String
|
||||||
formatField opts accountName depth balance ljust min max field = case field of
|
formatField opts accountName depth total ljust min max field = case field of
|
||||||
Format.Account -> formatValue ljust min max a
|
Format.Account -> formatValue ljust min max $ maybe "" (accountNameDrop (drop_ opts)) accountName
|
||||||
Format.DepthSpacer -> case min of
|
Format.DepthSpacer -> case min of
|
||||||
Just m -> formatValue ljust Nothing max $ replicate (depth * m) ' '
|
Just m -> formatValue ljust Nothing max $ replicate (depth * m) ' '
|
||||||
Nothing -> formatValue ljust Nothing max $ replicate depth ' '
|
Nothing -> formatValue ljust Nothing max $ replicate depth ' '
|
||||||
Format.Total -> formatValue ljust min max $ showAmountWithoutPrice balance
|
Format.Total -> formatValue ljust min max $ showAmountWithoutPrice total
|
||||||
_ -> ""
|
_ -> ""
|
||||||
where
|
|
||||||
a = maybe "" (accountNameDrop (drop_ opts)) accountName
|
|
||||||
|
|
||||||
tests_Hledger_Cli_Balance = TestList
|
tests_Hledger_Cli_Balance = TestList
|
||||||
[
|
[
|
||||||
|
|||||||
12
tests/balance-precision.test
Normal file
12
tests/balance-precision.test
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
bin/hledger -f- bal
|
||||||
|
<<<
|
||||||
|
1/1
|
||||||
|
a 1.00
|
||||||
|
b -1
|
||||||
|
>>>
|
||||||
|
1.00 a
|
||||||
|
-1.00 b
|
||||||
|
--------------------
|
||||||
|
0
|
||||||
|
>>>=0
|
||||||
Loading…
Reference in New Issue
Block a user