在C ++中打印int变量的一部分

时间:2012-08-06 15:48:45

标签: c++ cout

我声明了一些变量:

int area_code;
int telephone_number;

当我从用户那里得到输入时:

cout << "Enter the area code";
cin >> area_code;
cout << "Enter your local telephone number";
cin >> telephone_number;

现在当我想要显示它们时,如果它们的电话号码是6152222222,它应该显示为:

  

615-222-2222

对于我可以做的第一部分:

cout << area_code << "-";

但我不知道如何将它们与那个变量的短划线分开?

5 个答案:

答案 0 :(得分:4)

您可以使用数学计算您的号码的区号和本地交换代码:

  • 6152222222 / 10000删除最后四位数字,为您提供615222
  • 进一步除以1000即可615;通过1000取得除法的余数,可以得到222

请注意,使用int代表电话号码会限制您存储更多异国电话号码的能力,例如1-800-SOMETHING。使用封装string和其他验证的类可能是更好的选择:

class phone_number {
string phone;
public:
    phone_number(const string& p) {
        // validate p...
        if (p.size() != 10) {
            // Do something violent here...
            cerr << "The phone number is incorrect." << endl;
        }
        // Validate more things about the number before the assignment...
        phone = p;
    }
    friend ostream& operator<<(ostream &os, const phone_number& p);
};

ostream& operator<<(ostream &os, const phone_number& pn) {
    const string &p(pn.phone);
    os << "(" << p.substr(0, 3) << ")" << p.substr(3, 3) << "-" << p.substr(6);
    return os;
}

int main() {
    phone_number p = phone_number("6152784567");
    cout << p << endl;
    return 0;
}

This produces the expected output on ideone

答案 1 :(得分:4)

电话号码不应存储在整数变量中。您永远不知道电话号码可能需要多长时间,需要哪些特殊字符,是否需要字母字符,前导零等等。

真正的解决方案是至少使用std::string

答案 2 :(得分:2)

您可以使用std::numpunct执行此操作:

#include <iostream>
#include <locale>

struct telephone: std::numpunct<char> {
    char do_thousands_sep() const { return '-'; }
    std::string do_grouping() const { return "\04\03"; }
};

int main() {
    std::cout.imbue(std::locale(std::cout.getloc(), new telephone));
    std::cout << 6152222222ll;
}

输出:

615-222-2222

我仍然不推荐这种方法,除非您因遗留原因需要处理存储为整数的电话号码;使用字符串更灵活。

答案 3 :(得分:0)

将这些更改为std :: string类型。然后使用substr操作来获得前三个数字,等等。使用stringstream来获取整数和字符串。

老实说,如果你坚持将这些变量保存在整数中,我建议暂时将它们转换为字符串,并使用字符串运算来计算值xxx-xxxx,因为如果你使用{编写自己的代码{1}}和/,您实际上是在%<<操作中复制了您所做的工作。

另外,bee-tee-dubs,这个数字实际上并不适合32位有符号或无符号的int,我认为这是使用错误数据类型的另一个症状。

编辑C ++调味字符串和字符串操作而不是C调味它,因为我出于某种原因在C中思考。

答案 4 :(得分:-1)

只需将输入分为三个不同的数字:

end = 6152222222 % 10000
middle = 6152222222 / 10000
areaCode = middle / 1000
middle = middle % 10000