Subject: | format_price ignores NEG_FORMAT |
format_price doesn't take NEG_FORMAT into account when formatting negative numbers, unlike format_number.
For instance, if trying to use parens to denote negative prices in the accounting style, format_price just uses the locale's negative number style, regardless of NEG_FORMAT:
$ perl -MNumber::Format -wE '$f = Number::Format->new(neg_format => q[(x)]); say $f->format_number(-123); say $f->format_price(-123, undef, q[$])'
(123)
-$123.00
The docs for NEG_FORMAT claim that format_price uses format_negative, to apply NEG_FORMAT, to negative numbers:
NEG_FORMAT is only used by format_negative() and is a string
containing the letter 'x', where that letter will be replaced by a
positive representation of the number being passed to that function.
format_number() and format_price() utilize this feature by calling
format_negative() if the number was less than 0.
Unfortunately that does't seem to be the case. Actually format_price always invokes format_number on the absolute number, then uses its own logic to add the sign in the correct place relative to the currency symbol, based on locale settings, with n_sign_posn == 0 being the trigger for parens around negative numbers. And it turns out all locale parameters can be supplied as constructor arguments. So parens around negative prices can be achieved with:
$ perl -MNumber::Format -wE '$f = Number::Format->new(n_sign_posn => 0); say $f->format_number(-123); say $f->format_price(-123, undef, q[$])'
-123
($123.00)
But I couldn't see n_sign_posn documented anywhere as a valid argument to pass to ->new.
And even if this is supported, it's an obscure way of specifying the desired behaviour, completely unintuitive to somebody reading the code.
Also, see that n_sign_posn only affects format_price and not format_number. To have a formatter object that uses parens for both numbers and prices you have to set both neg_format and n_sign_pos:
$ perl -MNumber::Format -wE '$f = Number::Format->new(neg_format => q[(x)], n_sign_posn => 0); say $f->format_number(-123); say $f->format_price(-123, undef, q[$])'
(123)
($123.00)
Please can we have a way of specifying accounting-style negative numbers that works for both numbers and prices? Thanks.