From 758a224131dcc23147969aa691fb0825470253c5 Mon Sep 17 00:00:00 2001 From: Matus Goljer Date: Mon, 21 Sep 2015 21:21:31 +0200 Subject: Fix amount-regex to properly capture integer part. If the integer part was 2 digits, because the integer part was non-greedy, it only captured as much as necessary, namely one digit. The other digit was captured by the 5th group's [:word:] not 4th because that one is also optional. This results in incorrect reporting of amount length and broken aligning. Also move the decimal dot matching from 3rd group to 4th, and quote the dot. --- lisp/ledger-regex.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lisp/ledger-regex.el') diff --git a/lisp/ledger-regex.el b/lisp/ledger-regex.el index 5d525d95..cf86b2f9 100644 --- a/lisp/ledger-regex.el +++ b/lisp/ledger-regex.el @@ -27,8 +27,8 @@ (defconst ledger-amount-regex (concat "\\( \\|\t\\| \t\\)[ \t]*-?" "\\([A-Z$€£₹_(]+ *\\)?" - "\\(-?[0-9,\\.]+?\\)" - "\\(.[0-9)]+\\)?" + "\\(-?[0-9,]+\\)" + "\\(\\.[0-9)]+\\)?" "\\( *[[:word:]€£₹_\"]+\\)?" "\\([ \t]*[@={]@?[^\n;]+?\\)?" "\\([ \t]+;.+?\\|[ \t]*\\)?$")) -- cgit v1.2.3 From 767ab3e39c8dd6024c0904370654e5f0a9e24b2d Mon Sep 17 00:00:00 2001 From: Matus Goljer Date: Mon, 28 Sep 2015 18:03:32 +0200 Subject: Align amounts on the decimal separator. That is: A $10.00 B $5 C -$15.00 Before the numbers aligned at the end of the last digit. --- lisp/ledger-post.el | 3 +-- lisp/ledger-regex.el | 10 ++++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) (limited to 'lisp/ledger-regex.el') diff --git a/lisp/ledger-post.el b/lisp/ledger-post.el index 5696d0e4..d741442a 100644 --- a/lisp/ledger-post.el +++ b/lisp/ledger-post.el @@ -79,8 +79,7 @@ point at beginning of the commodity." (when (re-search-forward ledger-amount-regex end t) (goto-char (match-beginning 0)) (skip-syntax-forward " ") - (- (or (match-end 4) - (match-end 3)) (point))))) + (- (match-end 3) (point))))) (defun ledger-next-account (&optional end) "Move to the beginning of the posting, or status marker, limit to END. diff --git a/lisp/ledger-regex.el b/lisp/ledger-regex.el index cf86b2f9..6ced0223 100644 --- a/lisp/ledger-regex.el +++ b/lisp/ledger-regex.el @@ -27,8 +27,14 @@ (defconst ledger-amount-regex (concat "\\( \\|\t\\| \t\\)[ \t]*-?" "\\([A-Z$€£₹_(]+ *\\)?" - "\\(-?[0-9,]+\\)" - "\\(\\.[0-9)]+\\)?" + ;; We either match just a number after the commodity with no + ;; decimal or thousand separators or a number with thousand + ;; separators. If we have a decimal part starting with `,' + ;; or `.', because the match is non-greedy, it must leave at + ;; least one of those symbols for the following capture + ;; group, which then finishes the decimal part. + "\\(-?\\(?:[0-9]+\\|[0-9,.]+?\\)\\)" + "\\([,.][0-9)]+\\)?" "\\( *[[:word:]€£₹_\"]+\\)?" "\\([ \t]*[@={]@?[^\n;]+?\\)?" "\\([ \t]+;.+?\\|[ \t]*\\)?$")) -- cgit v1.2.3