money_put::do_put
underspecifiedSection: 28.3.4.7.3.3 [locale.money.put.virtuals] Status: New Submitter: Jonathan Wakely Opened: 2017-06-21 Last modified: 2017-06-27
Priority: 3
View all other issues in [locale.money.put.virtuals].
View all issues with New status.
Discussion:
Whether you get ".99
" or "0.99
" for the following depends on the implementation:
std::cout.imbue(std::locale("en_US")); std::cout << std::put_money(99.L);
I don't see any justification in [locale.money.put.virtuals] for the leading 0
, although that seems more useful.
[2017-06-27, Jonathan comments and provides wording]
I suggest that we require a leading zero. The wording below is similar
to how C specifies the %f
format specifier for fprintf
.
Proposed resolution:
This wording is relative to N4659.
Edit 28.3.4.7.3.3 [locale.money.put.virtuals] as indicated:
iter_type do_put(iter_type s, bool intl, ios_base& str, char_type fill, long double units) const; iter_type do_put(iter_type s, bool intl, ios_base& str, char_type fill, const string_type& digits) const;[…]
-2- Remarks: The currency symbol is generated if and only if(str.flags() & str.showbase)
is nonzero. If the format specifies a decimal point, at least one digit character appears before it. If the number of characters generated for the specified format is less than the value returned bystr.width()
on entry to the function, then copies offill
are inserted as necessary to pad to the specified width. For the valueaf
equal to(str.flags() & str.adjustfield)
, if(af == str.internal)
istrue
, the fill characters are placed wherenone
orspace
appears in the formatting pattern; otherwise if(af == str.left)
istrue
, they are placed after the other characters; otherwise, they are placed before the other characters.