summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/print.cc70
-rw-r--r--test/regress/align-amounts.test24
2 files changed, 64 insertions, 30 deletions
diff --git a/src/print.cc b/src/print.cc
index bcc8cf9c..4febd871 100644
--- a/src/print.cc
+++ b/src/print.cc
@@ -100,6 +100,33 @@ namespace {
}
}
+ std::ostringstream format_account_name(xact_t& xact, post_t * post)
+ {
+ std::ostringstream pbuf;
+
+ if (xact.state() == item_t::UNCLEARED)
+ pbuf << (post->state() == item_t::CLEARED ? "* " :
+ (post->state() == item_t::PENDING ? "! " : ""));
+
+ if (post->has_flags(POST_VIRTUAL)) {
+ if (post->has_flags(POST_MUST_BALANCE))
+ pbuf << '[';
+ else
+ pbuf << '(';
+ }
+
+ pbuf << post->account->fullname();
+
+ if (post->has_flags(POST_VIRTUAL)) {
+ if (post->has_flags(POST_MUST_BALANCE))
+ pbuf << ']';
+ else
+ pbuf << ')';
+ }
+
+ return pbuf;
+ }
+
void print_xact(report_t& report, std::ostream& out, xact_t& xact)
{
format_type_t format_type = FMT_WRITTEN;
@@ -158,6 +185,18 @@ namespace {
std::size_t count = xact.posts.size();
std::size_t index = 0;
+ std::size_t account_width =
+ (report.HANDLED(account_width_) ?
+ lexical_cast<std::size_t>(report.HANDLER(account_width_).str()) : 36);
+
+ // Find the longest account name to line up all amounts when account names
+ // are long
+ foreach (post_t * post, xact.posts) {
+ unistring name = format_account_name(xact, post).str();
+ if (account_width < name.length())
+ account_width = name.length();
+ }
+
foreach (post_t * post, xact.posts) {
index++;
@@ -168,37 +207,10 @@ namespace {
out << " ";
- std::ostringstream pbuf;
-
- if (xact.state() == item_t::UNCLEARED)
- pbuf << (post->state() == item_t::CLEARED ? "* " :
- (post->state() == item_t::PENDING ? "! " : ""));
-
- if (post->has_flags(POST_VIRTUAL)) {
- if (post->has_flags(POST_MUST_BALANCE))
- pbuf << '[';
- else
- pbuf << '(';
- }
-
- pbuf << post->account->fullname();
-
- if (post->has_flags(POST_VIRTUAL)) {
- if (post->has_flags(POST_MUST_BALANCE))
- pbuf << ']';
- else
- pbuf << ')';
- }
+ std::ostringstream pbuf = format_account_name(xact, post);
unistring name(pbuf.str());
- std::size_t account_width =
- (report.HANDLED(account_width_) ?
- lexical_cast<std::size_t>(report.HANDLER(account_width_).str()) : 36);
-
- if (account_width < name.length())
- account_width = name.length();
-
if (! post->has_flags(POST_CALCULATED) || report.HANDLED(generated)) {
out << name.extract();
std::string::size_type slip =
@@ -272,8 +284,6 @@ namespace {
out << ' ';
}
out << trailer;
-
- account_width += unistring(trailer).length();
}
} else {
out << pbuf.str();
diff --git a/test/regress/align-amounts.test b/test/regress/align-amounts.test
new file mode 100644
index 00000000..5e79beb7
--- /dev/null
+++ b/test/regress/align-amounts.test
@@ -0,0 +1,24 @@
+; Amounts should still align even though the account names are much longer than
+; the default --account-width.
+
+2023/01/01 Transaction with short account names
+ Assets:Short -10 ABC
+ Assets:Short -10 ABC
+ Expenses:Short 20 ABC
+
+2023/01/01 Transaction with long account names
+ Assets:Very:Long:Account:Name:That:Will:Push:The:Amount -10 ABC
+ Assets:Another:Long:Account:Name:That:Will:Push:The:Amount -10 ABC
+ Expenses:Short 20 ABC
+
+test print
+2023/01/01 Transaction with short account names
+ Assets:Short -10 ABC
+ Assets:Short -10 ABC
+ Expenses:Short 20 ABC
+
+2023/01/01 Transaction with long account names
+ Assets:Very:Long:Account:Name:That:Will:Push:The:Amount -10 ABC
+ Assets:Another:Long:Account:Name:That:Will:Push:The:Amount -10 ABC
+ Expenses:Short 20 ABC
+end test