From d4684c36fe50ab65a33f5f552b24222e3cbd524e Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Thu, 23 May 2024 08:08:12 -1000 Subject: [PATCH] ;doc: move "Amount formatting" down, it seems not the best first topic --- hledger/hledger.m4.md | 248 +++++++++++++++++++++--------------------- 1 file changed, 124 insertions(+), 124 deletions(-) diff --git a/hledger/hledger.m4.md b/hledger/hledger.m4.md index 7aab63576..c31931119 100644 --- a/hledger/hledger.m4.md +++ b/hledger/hledger.m4.md @@ -4530,130 +4530,6 @@ per:admin .... # PART 3: REPORTING CONCEPTS -# Amount formatting - - - -## Commodity display style - -For the amounts in each commodity, hledger chooses a consistent display style -(symbol placement, decimal mark and digit group marks, number of decimal digits) -to use in most reports. This is inferred as follows: - -First, if there's a [`D` directive](#d-directive) declaring a default commodity, -that commodity symbol and amount format is applied to all no-symbol amounts in the journal. - -Then each commodity's display style is determined from its -[`commodity` directive](#commodity-directive). We recommend always -declaring commodities with `commodity` directives, since they help -ensure consistent display styles and precisions, and bring other -benefits such as error checking for commodity symbols. -Here's an example: - -```journal -# Set display styles (and decimal marks, for parsing, if there is no decimal-mark directive) -# for the $, EUR, INR and no-symbol commodities: -commodity $1,000.00 -commodity EUR 1.000,00 -commodity INR 9,99,99,999.00 -commodity 1 000 000.9455 -``` - -But for convenience, if a `commodity` directive is not present, -hledger infers a commodity's display styles from its amounts as they are written in the journal -(excluding cost amounts and amounts in periodic transaction rules or auto posting rules). -It uses - -- the symbol placement and decimal mark of the first amount seen -- the digit group marks of the first amount with digit group marks -- and the maximum number of decimal digits seen across all amounts. - -And as fallback if no applicable amounts are found, it would use a -default style, like `$1000.00` (symbol on the left with no space, -period as decimal mark, and two decimal digits). - -Finally, commodity styles can be [overridden](#commodity-styles) by -the `-c/--commodity-style` command line option. - -## Rounding - -Amounts are stored internally as decimal numbers with up to 255 decimal places. -They are displayed -with their original journal precisions by print and print-like reports, -and rounded to their display precision (the number of decimal digits specified by the commodity display style) -by other reports. -When rounding, hledger uses [banker's rounding](https://en.wikipedia.org/wiki/Bankers_rounding) -(it rounds to the nearest even digit). So eg 0.5 displayed with zero decimal digits appears as "0". - -## Trailing decimal marks - -If you're wondering why your [`print`](#print) report sometimes shows -trailing decimal marks, with no decimal digits; it does this when -showing amounts that have digit group marks but no decimal digits, -to disambiguate them and allow them to be re-parsed reliably -(see [Decimal marks](#decimal-marks)). -Eg: - -```journal -commodity $1,000.00 - -2023-01-02 - (a) $1000 -``` - -```cli -$ hledger print -2023-01-02 - (a) $1,000. - -``` - -If this is a problem (eg when [exporting to Ledger](/ledger.md#hledger-to-ledger)), -you can avoid it by disabling digit group marks, eg with [-c/--commodity](#commodity-styles) -(for each affected commodity): - -```cli -$ hledger print -c '$1000.00' -2023-01-02 - (a) $1000 - -``` - -or by forcing print to always show decimal digits, with [--round](#print-amount-style): - -```cli -$ hledger print -c '$1,000.00' --round=soft -2023-01-02 - (a) $1,000.00 - -``` - -## Amount parseability - -More generally, hledger output falls into three rough categories, which -format amounts a little bit differently to suit different consumers: - -**1. "hledger-readable output" - should be readable by hledger (and by humans)** - - - This is produced by reports that show full journal entries: `print`, `import`, `close`, `rewrite` etc. - - It shows amounts with their original journal precisions, which may not be consistent. - - It adds a trailing decimal mark when needed to avoid showing ambiguous amounts. - - It can be parsed reliably (by hledger and ledger2beancount at least, but perhaps not by Ledger..) - -**2. "human-readable output" - usually for humans** - - - This is produced by all other reports. - - It shows amounts with standard display precisions, which will be consistent within each commodity. - - It shows ambiguous amounts unmodified. - - It can be parsed reliably in the context of a known report - (when you know decimals are consistently not being shown, you can assume a single mark is a digit group mark). - -**3. "machine-readable output" - usually for other software** - - - This is produced by all reports when an output format like `csv`, `tsv`, `json`, or `sql` is selected. - - It shows amounts as 1 or 2 do, but without digit group marks. - - It can be parsed reliably (if needed, the decimal mark can be changed with -c/--commodity-style). - # Time periods @@ -5377,6 +5253,130 @@ You can generate budget goals and forecast transactions at the same time, from t See also: [Budgeting and Forecasting](/budgeting-and-forecasting.html). +# Amount formatting + + + +## Commodity display style + +For the amounts in each commodity, hledger chooses a consistent display style +(symbol placement, decimal mark and digit group marks, number of decimal digits) +to use in most reports. This is inferred as follows: + +First, if there's a [`D` directive](#d-directive) declaring a default commodity, +that commodity symbol and amount format is applied to all no-symbol amounts in the journal. + +Then each commodity's display style is determined from its +[`commodity` directive](#commodity-directive). We recommend always +declaring commodities with `commodity` directives, since they help +ensure consistent display styles and precisions, and bring other +benefits such as error checking for commodity symbols. +Here's an example: + +```journal +# Set display styles (and decimal marks, for parsing, if there is no decimal-mark directive) +# for the $, EUR, INR and no-symbol commodities: +commodity $1,000.00 +commodity EUR 1.000,00 +commodity INR 9,99,99,999.00 +commodity 1 000 000.9455 +``` + +But for convenience, if a `commodity` directive is not present, +hledger infers a commodity's display styles from its amounts as they are written in the journal +(excluding cost amounts and amounts in periodic transaction rules or auto posting rules). +It uses + +- the symbol placement and decimal mark of the first amount seen +- the digit group marks of the first amount with digit group marks +- and the maximum number of decimal digits seen across all amounts. + +And as fallback if no applicable amounts are found, it would use a +default style, like `$1000.00` (symbol on the left with no space, +period as decimal mark, and two decimal digits). + +Finally, commodity styles can be [overridden](#commodity-styles) by +the `-c/--commodity-style` command line option. + +## Rounding + +Amounts are stored internally as decimal numbers with up to 255 decimal places. +They are displayed +with their original journal precisions by print and print-like reports, +and rounded to their display precision (the number of decimal digits specified by the commodity display style) +by other reports. +When rounding, hledger uses [banker's rounding](https://en.wikipedia.org/wiki/Bankers_rounding) +(it rounds to the nearest even digit). So eg 0.5 displayed with zero decimal digits appears as "0". + +## Trailing decimal marks + +If you're wondering why your [`print`](#print) report sometimes shows +trailing decimal marks, with no decimal digits; it does this when +showing amounts that have digit group marks but no decimal digits, +to disambiguate them and allow them to be re-parsed reliably +(see [Decimal marks](#decimal-marks)). +Eg: + +```journal +commodity $1,000.00 + +2023-01-02 + (a) $1000 +``` + +```cli +$ hledger print +2023-01-02 + (a) $1,000. + +``` + +If this is a problem (eg when [exporting to Ledger](/ledger.md#hledger-to-ledger)), +you can avoid it by disabling digit group marks, eg with [-c/--commodity](#commodity-styles) +(for each affected commodity): + +```cli +$ hledger print -c '$1000.00' +2023-01-02 + (a) $1000 + +``` + +or by forcing print to always show decimal digits, with [--round](#print-amount-style): + +```cli +$ hledger print -c '$1,000.00' --round=soft +2023-01-02 + (a) $1,000.00 + +``` + +## Amount parseability + +More generally, hledger output falls into three rough categories, which +format amounts a little bit differently to suit different consumers: + +**1. "hledger-readable output" - should be readable by hledger (and by humans)** + + - This is produced by reports that show full journal entries: `print`, `import`, `close`, `rewrite` etc. + - It shows amounts with their original journal precisions, which may not be consistent. + - It adds a trailing decimal mark when needed to avoid showing ambiguous amounts. + - It can be parsed reliably (by hledger and ledger2beancount at least, but perhaps not by Ledger..) + +**2. "human-readable output" - usually for humans** + + - This is produced by all other reports. + - It shows amounts with standard display precisions, which will be consistent within each commodity. + - It shows ambiguous amounts unmodified. + - It can be parsed reliably in the context of a known report + (when you know decimals are consistently not being shown, you can assume a single mark is a digit group mark). + +**3. "machine-readable output" - usually for other software** + + - This is produced by all reports when an output format like `csv`, `tsv`, `json`, or `sql` is selected. + - It shows amounts as 1 or 2 do, but without digit group marks. + - It can be parsed reliably (if needed, the decimal mark can be changed with -c/--commodity-style). + # Cost reporting In some transactions - for example a currency conversion, or a purchase or sale of stock - one commodity is exchanged for another.