Format money for a receipt
The receipt printer takes a plain string. Amounts arrive in minor units and have to come out grouped and signed the way finance expects.
- Always two decimal places.
- Group the whole part in threes with commas: 123456 becomes 1,234.56.
- Negatives are wrapped in parentheses with no minus sign, so -50 becomes (0.50).
formatMoney(minor: int) → string
C++ needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.
Where you start
std::string formatMoney(int minor) {
}
Worked examples
| Call | Result |
|---|---|
formatMoney(123456) | std::string("1,234.56") |
formatMoney(0) | std::string("0.00") |
formatMoney(5) | std::string("0.05") |
formatMoney(-50) | std::string("(0.50)") |
Hint
Split into whole and remainder first, build the grouped whole part, then glue on the sign.
Reference solution in C++
std::string formatMoney(int minor) {
bool neg = minor < 0;
int absv = neg ? -minor : minor;
string whole = std::to_string(absv / 100);
string cents = std::to_string(absv % 100);
if (cents.size() < 2) cents = "0" + cents;
string grouped;
for (size_t i = 0; i < whole.size(); i++) {
if (i > 0 && (whole.size() - i) % 3 == 0) grouped += ',';
grouped += whole[i];
}
string body = grouped + "." + cents;
return neg ? "(" + body + ")" : body;
}