Вот полная программа, которая показывает, как я это сделаю:
#include <iostream>
#include <iomanip>
#include <sstream>
std::string formatInt (unsigned int i) {
std::stringstream s;
s << std::setfill('0') << std::setw(3) << ((i % 100000000) / 100000) << '-'
<< std::setfill('0') << std::setw(2) << ((i % 100000) / 1000) << '-'
<< std::setfill('0') << std::setw(3) << (i % 1000);
return s.str();
}
int main (int argc, char *argv[]) {
if (argc > 1)
std::cout << formatInt (atoi (argv[1])) << std::endl;
else
std::cout << "Provide an argument, ya goose!" << std::endl;
return 0;
}
Запуск этого с определенными входами дает:
Input Output
-------- ----------
12345678 123-45-678
0 000-00-000
7012 000-07-012
10101010 101-01-010
123456789 234-56-789
-7 949-67-289
Последние два показывают важность тестирования. Если вам нужно другое поведение, вам нужно изменить код. Я обычно выбираю тихое применение правил, если вызывающий не может быть обеспокоен (или слишком глуп), чтобы следовать им, но, очевидно, некоторым людям нравится использовать принцип наименьшего удивления и выдвигать исключение: