don't separate differently-priced amounts any more; support for showing amounts without prices
This commit is contained in:
parent
53b7962658
commit
1bac7a92af
@ -108,6 +108,10 @@ showAmount a@(Amount (Commodity {symbol=sym,side=side,spaced=spaced}) _ pri) =
|
|||||||
price = case pri of (Just pamt) -> " @ " ++ showMixedAmount pamt
|
price = case pri of (Just pamt) -> " @ " ++ showMixedAmount pamt
|
||||||
Nothing -> ""
|
Nothing -> ""
|
||||||
|
|
||||||
|
-- | Get the string representation of an amount, without any "@ price".
|
||||||
|
showAmountWithoutPrice :: Amount -> String
|
||||||
|
showAmountWithoutPrice a = showAmount a{price=Nothing}
|
||||||
|
|
||||||
-- | Get the string representation (of the number part of) of an amount
|
-- | Get the string representation (of the number part of) of an amount
|
||||||
showAmount' :: Amount -> String
|
showAmount' :: Amount -> String
|
||||||
showAmount' (Amount (Commodity {comma=comma,precision=p}) q _) = quantity
|
showAmount' (Amount (Commodity {comma=comma,precision=p}) q _) = quantity
|
||||||
@ -128,7 +132,7 @@ punctuatethousands s =
|
|||||||
|
|
||||||
-- | Does this amount appear to be zero when displayed with its given precision ?
|
-- | Does this amount appear to be zero when displayed with its given precision ?
|
||||||
isZeroAmount :: Amount -> Bool
|
isZeroAmount :: Amount -> Bool
|
||||||
isZeroAmount = null . filter (`elem` "123456789") . showAmount
|
isZeroAmount = null . filter (`elem` "123456789") . showAmountWithoutPrice
|
||||||
|
|
||||||
-- | Is this amount "really" zero, regardless of the display precision ?
|
-- | Is this amount "really" zero, regardless of the display precision ?
|
||||||
-- Since we are using floating point, for now just test to some high precision.
|
-- Since we are using floating point, for now just test to some high precision.
|
||||||
@ -167,6 +171,15 @@ showMixedAmount m = concat $ intersperse "\n" $ map showfixedwidth as
|
|||||||
width = maximum $ map (length . show) as
|
width = maximum $ map (length . show) as
|
||||||
showfixedwidth = printf (printf "%%%ds" width) . show
|
showfixedwidth = printf (printf "%%%ds" width) . show
|
||||||
|
|
||||||
|
-- | Get the string representation of a mixed amount, but without
|
||||||
|
-- any "@ price"s.
|
||||||
|
showMixedAmountWithoutPrice :: MixedAmount -> String
|
||||||
|
showMixedAmountWithoutPrice m = concat $ intersperse "\n" $ map showfixedwidth as
|
||||||
|
where
|
||||||
|
(Mixed as) = normaliseMixedAmountIgnoringPrice m
|
||||||
|
width = maximum $ map (length . show) as
|
||||||
|
showfixedwidth = printf (printf "%%%ds" width) . showAmountWithoutPrice
|
||||||
|
|
||||||
-- | Get the string representation of a mixed amount, and if it
|
-- | Get the string representation of a mixed amount, and if it
|
||||||
-- appears to be all zero just show a bare 0, ledger-style.
|
-- appears to be all zero just show a bare 0, ledger-style.
|
||||||
showMixedAmountOrZero :: MixedAmount -> String
|
showMixedAmountOrZero :: MixedAmount -> String
|
||||||
@ -174,13 +187,20 @@ showMixedAmountOrZero a
|
|||||||
| isZeroMixedAmount a = "0"
|
| isZeroMixedAmount a = "0"
|
||||||
| otherwise = showMixedAmount a
|
| otherwise = showMixedAmount a
|
||||||
|
|
||||||
|
-- | Get the string representation of a mixed amount, or a bare 0,
|
||||||
|
-- without any "@ price"s.
|
||||||
|
showMixedAmountOrZeroWithoutPrice :: MixedAmount -> String
|
||||||
|
showMixedAmountOrZeroWithoutPrice a
|
||||||
|
| isZeroMixedAmount a = "0"
|
||||||
|
| otherwise = showMixedAmountWithoutPrice a
|
||||||
|
|
||||||
-- | Simplify a mixed amount by combining any component amounts which have
|
-- | Simplify a mixed amount by combining any component amounts which have
|
||||||
-- the same commodity and the same price. Also removes redundant zero amounts
|
-- the same commodity and the same price. Also removes zero amounts,
|
||||||
-- and adds a single zero amount if there are no amounts at all.
|
-- or adds a single zero amount if there are no amounts at all.
|
||||||
normaliseMixedAmount :: MixedAmount -> MixedAmount
|
normaliseMixedAmount :: MixedAmount -> MixedAmount
|
||||||
normaliseMixedAmount (Mixed as) = Mixed as''
|
normaliseMixedAmount (Mixed as) = Mixed as''
|
||||||
where
|
where
|
||||||
as'' = map sumAmountsPreservingPrice $ group $ sort as'
|
as'' = map sumSamePricedAmountsPreservingPrice $ group $ sort as'
|
||||||
sort = sortBy cmpsymbolandprice
|
sort = sortBy cmpsymbolandprice
|
||||||
cmpsymbolandprice a1 a2 = compare (sym a1,price a1) (sym a2,price a2)
|
cmpsymbolandprice a1 a2 = compare (sym a1,price a1) (sym a2,price a2)
|
||||||
group = groupBy samesymbolandprice
|
group = groupBy samesymbolandprice
|
||||||
@ -190,8 +210,26 @@ normaliseMixedAmount (Mixed as) = Mixed as''
|
|||||||
| otherwise = nonzeros
|
| otherwise = nonzeros
|
||||||
(zeros,nonzeros) = partition isZeroAmount as
|
(zeros,nonzeros) = partition isZeroAmount as
|
||||||
|
|
||||||
sumAmountsPreservingPrice [] = nullamt
|
sumSamePricedAmountsPreservingPrice [] = nullamt
|
||||||
sumAmountsPreservingPrice as = (sum as){price=price $ head as}
|
sumSamePricedAmountsPreservingPrice as = (sum as){price=price $ head as}
|
||||||
|
|
||||||
|
-- | Simplify a mixed amount by combining any component amounts which have
|
||||||
|
-- the same commodity, ignoring and discarding their unit prices if any.
|
||||||
|
-- Also removes zero amounts, or adds a single zero amount if there are no
|
||||||
|
-- amounts at all.
|
||||||
|
normaliseMixedAmountIgnoringPrice :: MixedAmount -> MixedAmount
|
||||||
|
normaliseMixedAmountIgnoringPrice (Mixed as) = Mixed as''
|
||||||
|
where
|
||||||
|
as'' = map sumAmountsDiscardingPrice $ group $ sort as'
|
||||||
|
group = groupBy samesymbol where samesymbol a1 a2 = sym a1 == sym a2
|
||||||
|
sort = sortBy (comparing sym)
|
||||||
|
sym = symbol . commodity
|
||||||
|
as' | null nonzeros = [head $ zeros ++ [nullamt]]
|
||||||
|
| otherwise = nonzeros
|
||||||
|
where (zeros,nonzeros) = partition isZeroAmount as
|
||||||
|
|
||||||
|
sumAmountsDiscardingPrice [] = nullamt
|
||||||
|
sumAmountsDiscardingPrice as = (sum as){price=Nothing}
|
||||||
|
|
||||||
-- | Convert a mixed amount's component amounts to the commodity of their
|
-- | Convert a mixed amount's component amounts to the commodity of their
|
||||||
-- saved price, if any.
|
-- saved price, if any.
|
||||||
|
|||||||
@ -31,6 +31,18 @@ showPosting (Posting _ a amt _ ttype) =
|
|||||||
VirtualPosting -> (\s -> "("++s++")", 20)
|
VirtualPosting -> (\s -> "("++s++")", 20)
|
||||||
_ -> (id,22)
|
_ -> (id,22)
|
||||||
showamount = padleft 12 . showMixedAmountOrZero
|
showamount = padleft 12 . showMixedAmountOrZero
|
||||||
|
-- XXX refactor
|
||||||
|
showPostingWithoutPrice (Posting _ a amt _ ttype) =
|
||||||
|
concatTopPadded [showaccountname a ++ " ", showamount amt]
|
||||||
|
where
|
||||||
|
ledger3ishlayout = False
|
||||||
|
acctnamewidth = if ledger3ishlayout then 25 else 22
|
||||||
|
showaccountname = printf ("%-"++(show acctnamewidth)++"s") . bracket . elideAccountName width
|
||||||
|
(bracket,width) = case ttype of
|
||||||
|
BalancedVirtualPosting -> (\s -> "["++s++"]", acctnamewidth-2)
|
||||||
|
VirtualPosting -> (\s -> "("++s++")", acctnamewidth-2)
|
||||||
|
_ -> (id,acctnamewidth)
|
||||||
|
showamount = padleft 12 . showMixedAmountOrZeroWithoutPrice
|
||||||
|
|
||||||
isReal :: Posting -> Bool
|
isReal :: Posting -> Bool
|
||||||
isReal p = ptype p == RegularPosting
|
isReal p = ptype p == RegularPosting
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user