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