gol*_*udo 11
这就是我亲自做的.可能不是解决问题的最快方法,并且绝对不像egrunin的功能那样可重复使用,但是它既干净又容易理解.我会把它扔进环中作为数学和循环解决方案的替代方案.
#include <sstream>
#include <string>
#include <iomanip>
std::string format(long num) {
std::ostringstream oss;
oss << std::setfill('0') << std::setw(8) << num;
return oss.str().insert(3, "-").insert(6, "-");
};
Run Code Online (Sandbox Code Playgroud)
经过测试,它有效.
format这里的参数是"XXX-XX-XXX",但它只查看(并跳过)破折号.
std::string foo(char *format, long num)
{
std::string s(format);
if (num < 0) { return "Input must be positive"; }
for (int nPos = s.length() - 1; nPos >= 0; --nPos)
{
if (s.at(nPos) == '-') continue;
s.at(nPos) = '0' + (num % 10);
num = num / 10;
}
if (num > 0) { return "Input too large for format string"; }
return s;
}
Run Code Online (Sandbox Code Playgroud)
用法:
int main()
{
printf(foo("###-##-###", 12345678).c_str());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是尝试使用标准库并使其完成大部分实际工作的不同方式:
#include <locale>
template <class T>
struct formatter : std::numpunct<T> {
protected:
T do_thousands_sep() const { return T('-'); }
std::basic_string<T> do_grouping() const {
return std::basic_string<T>("\3\2\3");
}
};
#ifdef TEST
#include <iostream>
int main() {
std::locale fmt(std::locale::classic(), new formatter<char>);
std::cout.imbue(fmt);
std::cout << 12345678 << std::endl;
return 0;
}
#endif
Run Code Online (Sandbox Code Playgroud)
要返回一个字符串,只需写入一个字符串流,然后返回它.str().
如果您只想以这种方式打印一个数字,但是如果您想在多个地方执行此类操作(或者,特别是,如果您希望格式化所有以特定流方式传输的数字),这可能会有点过头了)它变得更合理.
| 归档时间: |
|
| 查看次数: |
15228 次 |
| 最近记录: |