imp: csv: Do not display thousands separators when outputting csv.
This commit is contained in:
parent
76b5c5f2ac
commit
c4004fca28
@ -73,6 +73,7 @@ module Hledger.Data.Amount (
|
|||||||
noColour,
|
noColour,
|
||||||
noPrice,
|
noPrice,
|
||||||
oneLine,
|
oneLine,
|
||||||
|
csvDisplay,
|
||||||
amountstyle,
|
amountstyle,
|
||||||
styleAmount,
|
styleAmount,
|
||||||
styleAmountExceptPrecision,
|
styleAmountExceptPrecision,
|
||||||
@ -200,6 +201,7 @@ quoteCommoditySymbolIfNeeded s
|
|||||||
data AmountDisplayOpts = AmountDisplayOpts
|
data AmountDisplayOpts = AmountDisplayOpts
|
||||||
{ displayPrice :: Bool -- ^ Whether to display the Price of an Amount.
|
{ displayPrice :: Bool -- ^ Whether to display the Price of an Amount.
|
||||||
, displayZeroCommodity :: Bool -- ^ If the Amount rounds to 0, whether to display its commodity string.
|
, displayZeroCommodity :: Bool -- ^ If the Amount rounds to 0, whether to display its commodity string.
|
||||||
|
, displayThousandsSep :: Bool -- ^ Whether to display thousands separators.
|
||||||
, displayColour :: Bool -- ^ Whether to colourise negative Amounts.
|
, displayColour :: Bool -- ^ Whether to colourise negative Amounts.
|
||||||
, displayOneLine :: Bool -- ^ Whether to display on one line.
|
, displayOneLine :: Bool -- ^ Whether to display on one line.
|
||||||
, displayMinWidth :: Maybe Int -- ^ Minimum width to pad to
|
, displayMinWidth :: Maybe Int -- ^ Minimum width to pad to
|
||||||
@ -217,6 +219,7 @@ noColour :: AmountDisplayOpts
|
|||||||
noColour = AmountDisplayOpts { displayPrice = True
|
noColour = AmountDisplayOpts { displayPrice = True
|
||||||
, displayColour = False
|
, displayColour = False
|
||||||
, displayZeroCommodity = False
|
, displayZeroCommodity = False
|
||||||
|
, displayThousandsSep = True
|
||||||
, displayOneLine = False
|
, displayOneLine = False
|
||||||
, displayMinWidth = Just 0
|
, displayMinWidth = Just 0
|
||||||
, displayMaxWidth = Nothing
|
, displayMaxWidth = Nothing
|
||||||
@ -231,6 +234,10 @@ noPrice = def{displayPrice=False}
|
|||||||
oneLine :: AmountDisplayOpts
|
oneLine :: AmountDisplayOpts
|
||||||
oneLine = def{displayOneLine=True, displayPrice=False}
|
oneLine = def{displayOneLine=True, displayPrice=False}
|
||||||
|
|
||||||
|
-- | Display Amount and MixedAmount in a form suitable for CSV output.
|
||||||
|
csvDisplay :: AmountDisplayOpts
|
||||||
|
csvDisplay = oneLine{displayThousandsSep=False}
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- Amount styles
|
-- Amount styles
|
||||||
|
|
||||||
@ -472,7 +479,7 @@ showAmountB opts a@Amount{astyle=style} =
|
|||||||
L -> showC (wbFromText c) space <> quantity' <> price
|
L -> showC (wbFromText c) space <> quantity' <> price
|
||||||
R -> quantity' <> showC space (wbFromText c) <> price
|
R -> quantity' <> showC space (wbFromText c) <> price
|
||||||
where
|
where
|
||||||
quantity = showamountquantity a
|
quantity = showamountquantity $ if displayThousandsSep opts then a else a{astyle=(astyle a){asdigitgroups=Nothing}}
|
||||||
(quantity',c) | amountLooksZero a && not (displayZeroCommodity opts) = (WideBuilder (TB.singleton '0') 1,"")
|
(quantity',c) | amountLooksZero a && not (displayZeroCommodity opts) = (WideBuilder (TB.singleton '0') 1,"")
|
||||||
| otherwise = (quantity, quoteCommoditySymbolIfNeeded $ acommodity a)
|
| otherwise = (quantity, quoteCommoditySymbolIfNeeded $ acommodity a)
|
||||||
space = if not (T.null c) && ascommodityspaced style then WideBuilder (TB.singleton ' ') 1 else mempty
|
space = if not (T.null c) && ascommodityspaced style then WideBuilder (TB.singleton ' ') 1 else mempty
|
||||||
|
|||||||
@ -120,8 +120,8 @@ accountTransactionsReportItemAsCsvRecord
|
|||||||
where
|
where
|
||||||
idx = T.pack $ show tindex
|
idx = T.pack $ show tindex
|
||||||
date = showDate $ transactionRegisterDate wd reportq thisacctq t
|
date = showDate $ transactionRegisterDate wd reportq thisacctq t
|
||||||
amt = wbToText $ showMixedAmountB oneLine change
|
amt = wbToText $ showMixedAmountB csvDisplay change
|
||||||
bal = wbToText $ showMixedAmountB oneLine balance
|
bal = wbToText $ showMixedAmountB csvDisplay balance
|
||||||
|
|
||||||
-- | Render a register report as plain text suitable for console output.
|
-- | Render a register report as plain text suitable for console output.
|
||||||
accountTransactionsReportAsText :: CliOpts -> Query -> Query -> AccountTransactionsReport -> TL.Text
|
accountTransactionsReportAsText :: CliOpts -> Query -> Query -> AccountTransactionsReport -> TL.Text
|
||||||
|
|||||||
@ -422,7 +422,7 @@ balanceReportAsCsv opts (items, total) =
|
|||||||
|
|
||||||
showName = accountNameDrop (drop_ opts)
|
showName = accountNameDrop (drop_ opts)
|
||||||
renderAmount amt = wbToText $ showMixedAmountB bopts amt
|
renderAmount amt = wbToText $ showMixedAmountB bopts amt
|
||||||
where bopts = (balanceOpts False opts){displayOrder = order}
|
where bopts = csvDisplay{displayOrder = order}
|
||||||
order = if layout_ opts == LayoutBare then Just (S.toList $ maCommodities amt) else Nothing
|
order = if layout_ opts == LayoutBare then Just (S.toList $ maCommodities amt) else Nothing
|
||||||
|
|
||||||
-- | Render a single-column balance report as plain text.
|
-- | Render a single-column balance report as plain text.
|
||||||
@ -455,7 +455,7 @@ balanceReportAsText' opts ((items, total)) =
|
|||||||
[ Cell TopRight damts
|
[ Cell TopRight damts
|
||||||
, Cell TopLeft (fmap wbFromText cs)
|
, Cell TopLeft (fmap wbFromText cs)
|
||||||
, Cell TopLeft (replicate (length damts - 1) mempty ++ [wbFromText dispname]) ]
|
, Cell TopLeft (replicate (length damts - 1) mempty ++ [wbFromText dispname]) ]
|
||||||
where dopts = (balanceOpts True opts){displayOrder=Just cs}
|
where dopts = oneLine{displayColour=color_ opts, displayOrder=Just cs}
|
||||||
cs = S.toList $ maCommodities amt
|
cs = S.toList $ maCommodities amt
|
||||||
dispname = T.replicate ((depth - 1) * 2) " " <> acctname
|
dispname = T.replicate ((depth - 1) * 2) " " <> acctname
|
||||||
damts = showMixedAmountLinesB dopts amt
|
damts = showMixedAmountLinesB dopts amt
|
||||||
@ -512,7 +512,7 @@ renderComponent topaligned oneline opts (acctname, depth, total) (FormatField lj
|
|||||||
| topaligned = TopRight
|
| topaligned = TopRight
|
||||||
| ljust = BottomLeft
|
| ljust = BottomLeft
|
||||||
| otherwise = BottomRight
|
| otherwise = BottomRight
|
||||||
dopts = (balanceOpts True opts){displayOneLine=oneline, displayMinWidth=mmin, displayMaxWidth=mmax}
|
dopts = noPrice{displayColour=color_ opts, displayOneLine=oneline, displayMinWidth=mmin, displayMaxWidth=mmax}
|
||||||
|
|
||||||
-- rendering multi-column balance reports
|
-- rendering multi-column balance reports
|
||||||
|
|
||||||
@ -742,14 +742,10 @@ multiBalanceRowAsWbs bopts ReportOpts{..} colspans (PeriodicReportRow _ as rowto
|
|||||||
m [] = [n]
|
m [] = [n]
|
||||||
|
|
||||||
multiBalanceRowAsCsvText :: ReportOpts -> [DateSpan] -> PeriodicReportRow a MixedAmount -> [[T.Text]]
|
multiBalanceRowAsCsvText :: ReportOpts -> [DateSpan] -> PeriodicReportRow a MixedAmount -> [[T.Text]]
|
||||||
multiBalanceRowAsCsvText opts colspans = fmap (fmap wbToText) . multiBalanceRowAsWbs (balanceOpts False opts) opts colspans
|
multiBalanceRowAsCsvText opts colspans = fmap (fmap wbToText) . multiBalanceRowAsWbs csvDisplay opts colspans
|
||||||
|
|
||||||
multiBalanceRowAsTableText :: ReportOpts -> PeriodicReportRow a MixedAmount -> [[WideBuilder]]
|
multiBalanceRowAsTableText :: ReportOpts -> PeriodicReportRow a MixedAmount -> [[WideBuilder]]
|
||||||
multiBalanceRowAsTableText opts = multiBalanceRowAsWbs (balanceOpts True opts) opts []
|
multiBalanceRowAsTableText opts = multiBalanceRowAsWbs oneLine{displayColour=color_ opts} opts []
|
||||||
|
|
||||||
-- | Amount display options to use for balance reports
|
|
||||||
balanceOpts :: Bool -> ReportOpts -> AmountDisplayOpts
|
|
||||||
balanceOpts isTable ReportOpts{..} = oneLine {displayColour = isTable && color_}
|
|
||||||
|
|
||||||
tests_Balance = testGroup "Balance" [
|
tests_Balance = testGroup "Balance" [
|
||||||
|
|
||||||
|
|||||||
@ -179,8 +179,8 @@ postingToCSV p =
|
|||||||
map (\(a@(Amount {aquantity=q,acommodity=c})) ->
|
map (\(a@(Amount {aquantity=q,acommodity=c})) ->
|
||||||
-- commodity goes into separate column, so we suppress it, along with digit group
|
-- commodity goes into separate column, so we suppress it, along with digit group
|
||||||
-- separators and prices
|
-- separators and prices
|
||||||
let a_ = a{acommodity="",astyle=(astyle a){asdigitgroups=Nothing},aprice=Nothing} in
|
let a_ = amountStripPrices a{acommodity=""} in
|
||||||
let showamt = wbToText . showAmountB noColour in
|
let showamt = wbToText . showAmountB csvDisplay in
|
||||||
let amount = showamt a_ in
|
let amount = showamt a_ in
|
||||||
let credit = if q < 0 then showamt $ negate a_ else "" in
|
let credit = if q < 0 then showamt $ negate a_ else "" in
|
||||||
let debit = if q >= 0 then showamt a_ else "" in
|
let debit = if q >= 0 then showamt a_ else "" in
|
||||||
|
|||||||
@ -88,8 +88,8 @@ postingsReportItemAsCsvRecord (_, _, _, p, b) = [idx,date,code,desc,acct,amt,bal
|
|||||||
VirtualPosting -> wrap "(" ")"
|
VirtualPosting -> wrap "(" ")"
|
||||||
_ -> id
|
_ -> id
|
||||||
-- Since postingsReport strips prices from all Amounts when not used, we can display prices.
|
-- Since postingsReport strips prices from all Amounts when not used, we can display prices.
|
||||||
amt = wbToText . showMixedAmountB oneLine $ pamount p
|
amt = wbToText . showMixedAmountB csvDisplay $ pamount p
|
||||||
bal = wbToText $ showMixedAmountB oneLine b
|
bal = wbToText $ showMixedAmountB csvDisplay b
|
||||||
|
|
||||||
-- | Render a register report as plain text suitable for console output.
|
-- | Render a register report as plain text suitable for console output.
|
||||||
postingsReportAsText :: CliOpts -> PostingsReport -> TL.Text
|
postingsReportAsText :: CliOpts -> PostingsReport -> TL.Text
|
||||||
|
|||||||
@ -168,7 +168,19 @@ hledger -f - balance -N --output-format=csv --tree
|
|||||||
"Assets:Cash","$-1"
|
"Assets:Cash","$-1"
|
||||||
>>>= 0
|
>>>= 0
|
||||||
|
|
||||||
# 9. --declared includes all declared leaf accounts, even if they have no postings.
|
# 9. CSV output always does not show thousands separators
|
||||||
|
hledger -f - balance -N --output-format=csv
|
||||||
|
<<<
|
||||||
|
2021-01-01 Test
|
||||||
|
Assets:ABC $10 000.00
|
||||||
|
Assets:Cash -$10 000.00
|
||||||
|
>>>
|
||||||
|
"account","balance"
|
||||||
|
"Assets:ABC","$10000.00"
|
||||||
|
"Assets:Cash","$-10000.00"
|
||||||
|
>>>= 0
|
||||||
|
|
||||||
|
# 10. --declared includes all declared leaf accounts, even if they have no postings.
|
||||||
# They are filtered, depth-clipped, and form trees like the others.
|
# They are filtered, depth-clipped, and form trees like the others.
|
||||||
hledger -f - balance -NE --declared --tree --depth 2 a
|
hledger -f - balance -NE --declared --tree --depth 2 a
|
||||||
<<<
|
<<<
|
||||||
@ -183,7 +195,7 @@ account b
|
|||||||
0 ab
|
0 ab
|
||||||
>>>= 0
|
>>>= 0
|
||||||
|
|
||||||
# 10. In list mode we can see that non-leaf declared accounts are excluded.
|
# 11. In list mode we can see that non-leaf declared accounts are excluded.
|
||||||
hledger -f - balance -NE --declared --flat
|
hledger -f - balance -NE --declared --flat
|
||||||
<<<
|
<<<
|
||||||
account a
|
account a
|
||||||
|
|||||||
@ -328,7 +328,23 @@ $ hledger -f - balancesheet --tree --output-format=csv --drop 1
|
|||||||
"total"
|
"total"
|
||||||
"Net:","$1"
|
"Net:","$1"
|
||||||
|
|
||||||
# 14. In compound reports like balancesheet, parent accounts might not have
|
<
|
||||||
|
2020-03-01 * Rent
|
||||||
|
assets:a -$10 000.00
|
||||||
|
expenses
|
||||||
|
|
||||||
|
# 14. CSV output drops thousands separators
|
||||||
|
$ hledger -f - balancesheet --output-format=csv
|
||||||
|
"Balance Sheet 2020-03-01",""
|
||||||
|
"Account","2020-03-01"
|
||||||
|
"Assets",""
|
||||||
|
"assets:a","$-10000.00"
|
||||||
|
"total","$-10000.00"
|
||||||
|
"Liabilities",""
|
||||||
|
"total"
|
||||||
|
"Net:","$-10000.00"
|
||||||
|
|
||||||
|
# 15. In compound reports like balancesheet, parent accounts might not have
|
||||||
# the appropriate type for a subreport, but in tree reports they should be
|
# the appropriate type for a subreport, but in tree reports they should be
|
||||||
# displayed anyway, and with the right inclusive amounts and starting
|
# displayed anyway, and with the right inclusive amounts and starting
|
||||||
# balances. (#1698)
|
# balances. (#1698)
|
||||||
|
|||||||
11
hledger/test/print/csv.test
Normal file
11
hledger/test/print/csv.test
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<
|
||||||
|
2009/1/1
|
||||||
|
a $10 000.00
|
||||||
|
b -$10 000.00
|
||||||
|
|
||||||
|
# csv output should not display thousands separators
|
||||||
|
$ hledger -f- print -O csv
|
||||||
|
"txnidx","date","date2","status","code","description","comment","account","amount","commodity","credit","debit","posting-status","posting-comment"
|
||||||
|
"1","2009-01-01","","","","","","a","10000.00","$","","10000.00","",""
|
||||||
|
"1","2009-01-01","","","","","","b","-10000.00","$","10000.00","","",""
|
||||||
|
>= 0
|
||||||
8
hledger/test/register/csv.test
Normal file
8
hledger/test/register/csv.test
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
2019-1-1
|
||||||
|
(a) 10 000 000.0
|
||||||
|
|
||||||
|
# 1. Csv output will not display thousands separators
|
||||||
|
$ hledger -f- register -O csv
|
||||||
|
"txnidx","date","code","description","account","amount","total"
|
||||||
|
"1","2019-01-01","","","(a)","10000000.0","10000000.0"
|
||||||
|
>=
|
||||||
Loading…
Reference in New Issue
Block a user