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, | ||||
|   noPrice, | ||||
|   oneLine, | ||||
|   csvDisplay, | ||||
|   amountstyle, | ||||
|   styleAmount, | ||||
|   styleAmountExceptPrecision, | ||||
| @ -200,6 +201,7 @@ quoteCommoditySymbolIfNeeded s | ||||
| data AmountDisplayOpts = AmountDisplayOpts | ||||
|   { displayPrice         :: Bool       -- ^ Whether to display the Price of an Amount. | ||||
|   , 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. | ||||
|   , displayOneLine       :: Bool       -- ^ Whether to display on one line. | ||||
|   , displayMinWidth      :: Maybe Int  -- ^ Minimum width to pad to | ||||
| @ -217,6 +219,7 @@ noColour :: AmountDisplayOpts | ||||
| noColour = AmountDisplayOpts { displayPrice         = True | ||||
|                              , displayColour        = False | ||||
|                              , displayZeroCommodity = False | ||||
|                              , displayThousandsSep  = True | ||||
|                              , displayOneLine       = False | ||||
|                              , displayMinWidth      = Just 0 | ||||
|                              , displayMaxWidth      = Nothing | ||||
| @ -231,6 +234,10 @@ noPrice = def{displayPrice=False} | ||||
| oneLine :: AmountDisplayOpts | ||||
| 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 | ||||
| 
 | ||||
| @ -472,7 +479,7 @@ showAmountB opts a@Amount{astyle=style} = | ||||
|       L -> showC (wbFromText c) space <> quantity' <> price | ||||
|       R -> quantity' <> showC space (wbFromText c) <> price | ||||
|   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,"") | ||||
|                   | otherwise = (quantity, quoteCommoditySymbolIfNeeded $ acommodity a) | ||||
|     space = if not (T.null c) && ascommodityspaced style then WideBuilder (TB.singleton ' ') 1 else mempty | ||||
|  | ||||
| @ -120,8 +120,8 @@ accountTransactionsReportItemAsCsvRecord | ||||
|   where | ||||
|     idx  = T.pack $ show tindex | ||||
|     date = showDate $ transactionRegisterDate wd reportq thisacctq t | ||||
|     amt  = wbToText $ showMixedAmountB oneLine change | ||||
|     bal  = wbToText $ showMixedAmountB oneLine balance | ||||
|     amt  = wbToText $ showMixedAmountB csvDisplay change | ||||
|     bal  = wbToText $ showMixedAmountB csvDisplay balance | ||||
| 
 | ||||
| -- | Render a register report as plain text suitable for console output. | ||||
| accountTransactionsReportAsText :: CliOpts -> Query -> Query -> AccountTransactionsReport -> TL.Text | ||||
|  | ||||
| @ -422,7 +422,7 @@ balanceReportAsCsv opts (items, total) = | ||||
| 
 | ||||
|     showName = accountNameDrop (drop_ opts) | ||||
|     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 | ||||
| 
 | ||||
| -- | Render a single-column balance report as plain text. | ||||
| @ -455,7 +455,7 @@ balanceReportAsText' opts ((items, total)) = | ||||
|         [ Cell TopRight damts | ||||
|         , Cell TopLeft (fmap wbFromText cs) | ||||
|         , 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 | ||||
|             dispname = T.replicate ((depth - 1) * 2) " " <> acctname | ||||
|             damts = showMixedAmountLinesB dopts amt | ||||
| @ -512,7 +512,7 @@ renderComponent topaligned oneline opts (acctname, depth, total) (FormatField lj | ||||
|           | topaligned          = TopRight | ||||
|           | ljust               = BottomLeft | ||||
|           | 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 | ||||
| 
 | ||||
| @ -742,14 +742,10 @@ multiBalanceRowAsWbs bopts ReportOpts{..} colspans (PeriodicReportRow _ as rowto | ||||
|           m [] = [n] | ||||
| 
 | ||||
| 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 opts = multiBalanceRowAsWbs (balanceOpts True opts) opts [] | ||||
| 
 | ||||
| -- | Amount display options to use for balance reports | ||||
| balanceOpts :: Bool -> ReportOpts -> AmountDisplayOpts | ||||
| balanceOpts isTable ReportOpts{..} = oneLine {displayColour = isTable && color_} | ||||
| multiBalanceRowAsTableText opts = multiBalanceRowAsWbs oneLine{displayColour=color_ opts} opts [] | ||||
| 
 | ||||
| tests_Balance = testGroup "Balance" [ | ||||
| 
 | ||||
|  | ||||
| @ -179,8 +179,8 @@ postingToCSV p = | ||||
|   map (\(a@(Amount {aquantity=q,acommodity=c})) -> | ||||
|     -- commodity goes into separate column, so we suppress it, along with digit group | ||||
|     -- separators and prices | ||||
|     let a_ = a{acommodity="",astyle=(astyle a){asdigitgroups=Nothing},aprice=Nothing} in | ||||
|     let showamt = wbToText . showAmountB noColour in | ||||
|     let a_ = amountStripPrices a{acommodity=""} in | ||||
|     let showamt = wbToText . showAmountB csvDisplay in | ||||
|     let amount = showamt a_ in | ||||
|     let credit = if q < 0 then showamt $ negate 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 "(" ")" | ||||
|                              _ -> id | ||||
|     -- Since postingsReport strips prices from all Amounts when not used, we can display prices. | ||||
|     amt = wbToText . showMixedAmountB oneLine $ pamount p | ||||
|     bal = wbToText $ showMixedAmountB oneLine b | ||||
|     amt = wbToText . showMixedAmountB csvDisplay $ pamount p | ||||
|     bal = wbToText $ showMixedAmountB csvDisplay b | ||||
| 
 | ||||
| -- | Render a register report as plain text suitable for console output. | ||||
| postingsReportAsText :: CliOpts -> PostingsReport -> TL.Text | ||||
|  | ||||
| @ -168,7 +168,19 @@ hledger -f - balance -N --output-format=csv --tree | ||||
| "Assets:Cash","$-1" | ||||
| >>>= 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. | ||||
| hledger -f - balance -NE --declared --tree --depth 2 a | ||||
| <<< | ||||
| @ -183,7 +195,7 @@ account b | ||||
|                    0    ab | ||||
| >>>= 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 | ||||
| <<< | ||||
| account a | ||||
|  | ||||
| @ -328,7 +328,23 @@ $ hledger -f - balancesheet --tree --output-format=csv --drop 1 | ||||
| "total" | ||||
| "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  | ||||
| # displayed anyway, and with the right inclusive amounts and starting  | ||||
| # 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