用C ++格式化整数

时间:2010-05-12 02:13:26

标签: c++ string g++

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

XXX-XX-XXX

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

这样做的好方法是什么?

10 个答案:

答案 0 :(得分: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, "-");
};

答案 1 :(得分: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;
}

用法:

int main()
{
    printf(foo("###-##-###", 12345678).c_str());

    return 0;
}

答案 2 :(得分: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

要返回字符串,只需写入字符串流,然后返回其.str()

如果您只想以这种方式打印一个数字,但是如果您想在多个地方执行此类操作(或者,尤其是如果您想格式化 all 数字以某种方式进入特定的流)它变得更加合理。

答案 3 :(得分:4)

这是一个完整的程序,显示我是如何做到的:

#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

最后两个显示了测试的重要性。如果您想要不同的行为,则需要修改代码。如果呼叫者不能被打扰(或者太愚蠢)跟随他们,我通常选择默认执行规则,但显然有些人喜欢使用最不惊讶的原则并提出异常: - )

答案 4 :(得分:3)

您可以使用std :: ostringstream类将数字转换为字符串。然后,您可以使用数字字符串并使用您想要的任何格式打印它们,如下面的代码所示:

std::ostringstream oss;
oss << std::setfill('0') << std::setw(8) << number;
std::string str = oss.str();
if ( str.length() != 8 ){
    // some form of handling
}else{
    // print digits formatted as desired
}

答案 5 :(得分:1)

int your_number = 12345678;

std::cout << (your_number/10000000) % 10 << (your_number/1000000) % 10 << (your_number/100000) %10 << "-" << (your_number/10000) %10 << (your_number/1000) %10 << "-" << (your_number/100) %10 << (your_number/10) %10 << (your_number) %10;

http://www.ideone.com/17eRv

它不是一个函数,而是一个按编号解析int数的通用方法。

答案 6 :(得分:1)

这是怎么回事?

std::string format(int x)
{
    std::stringstream ss

    ss.fill('0');
    ss.width(3);
    ss << (x / 10000);

    ss.width(1);
    ss << "-";

    ss.width(2);
    ss << (x / 1000) % 100;

    ss.width(1);
    ss << "-";

    ss.width(3);
    ss << x % 1000;

    return ss.str();
}

编辑1 :我看到不推荐使用strstream并将其替换为stringstream。

编辑2 :修复了丢失前导0的问题。我知道,这很难看。

答案 7 :(得分:1)

#include <iostream>
#include <string>

using namespace std;

template<class Int, class Bi>
void format(Int n, Bi first, Bi last)
{
    if( first == last ) return;
    while( n != 0 ) {
        Int t(n % 10);
        n /= 10;
        while( *--last != 'X' && last != first);
        *last = t + '0';
    }
}

int main(int argc, char* argv[])
{
    int i = 23462345;
    string s("XXX-XX-XXX");
    format(i, s.begin(), s.end());
    cout << s << endl;
    return 0;
}

答案 8 :(得分:0)

显然是char *而不是string,但你明白了。完成后你需要释放输出,你应该添加错误检查,但是应该这样做:

char * formatter(int i)
{    
  char *buf = malloc(11*sizeof(char));
  sprintf(buf, "%03d-%02d-%03d", i/100000, (i/1000)%100, i%1000);
  return buf;
}

答案 9 :(得分:-1)

您不需要mallocnew,只需将buf定义为char buff[11];