用C++格式化整数

neu*_*cer 10 c++ string g++

我有一个8位整数,我想打印格式如下:

XXX-XX-XXX

我想使用一个带有int并返回一个字符串的函数.

这样做的好方法是什么?

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)


egr*_*nin 6

经过测试,它有效.

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)

  • 但是什么`cout << foo("### - ##",12345)<< endl`呢?如果函数只能使用一个特定长度的格式字符串,那么你应该"断言"它.IMO你应该"断言"范围条件而不是默默地失败. (3认同)
  • 不仅是YAGNI,还有复制已经存在于标准库中的东西.几乎足以有资格获得-1 ... (2认同)
  • 嘿伙计们,这是一个**例子**解决了确切的问题,并建议采取进一步的方法......我的意思是,你不要在生产代码中留下"真正的错误",对吗?Sheesh,坚韧的人群.我自己是YAGNI的忠实信徒. (2认同)

Jer*_*fin 5

这是尝试使用标准库并使其完成大部分实际工作的不同方式:

#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().

如果您只想以这种方式打印一个数字,但是如果您想在多个地方执行此类操作(或者,特别是,如果您希望格式化所有以特定流方式传输的数字),这可能会有点过头了)它变得更合理.

  • 我真的看不到有太多人用这种方式解决这个特殊问题,但是最精彩的答案却是+1. (3认同)