【问题标题】:Printing numbers with Commas using <string> C++使用 <string> C++ 用逗号打印数字
【发布时间】:2021-06-14 21:22:23
【问题描述】:

我真的在发帖,因为我过去曾遇到过这个问题,并且发现很难找到答案。最终我确实偶然发现了一些东西,但这不是最干净的东西。我最终在我的编码知识方面取得了进步,我能够制作一个看起来很干净的函数。在这里发帖分享,希望对他人有所帮助。

【问题讨论】:

  • 看起来像 this question 的副本。
  • “用逗号打印数字”是什么意思?
  • StackOverflow 是一个问答网站。虽然可以发布您自己的答案并且even encouraged,但您的帖子应该是问题的形式。

标签: c++ string formatting


【解决方案1】:

编辑:由于处理负数的问题而进行了多次编辑,解决方案确实是一种解决方法,但按照我的标准看起来仍然很整洁。

我基本上依赖于 to_string 函数,然后在必要时添加逗号。

inline string printWithCommas(unsigned int number) {
    string temp = to_string(number);
    unsigned int numLength = temp.size();

    temp.reserve((numLength - 1) / 3 + numLength);
    for (unsigned int i = 1; i <= (numLength - 1) / 3; i++)
        temp.insert(numLength - i * 3, 1, ',');
    
    return temp;
}

对于可能为负数的整数。

inline string printWithCommas(int number) {
    if (number < 0)
        return string("-").append(printWithCommas((unsigned int)(number*-1));
    return printWithCommas((unsigned int)number);
}

对于浮点数和双精度数,它仅针对 numLength 的初始化而改变。

inline __device__ __host__ string printWithCommas(long double number) {
    if (number < 0)
        return string("-").append(printWithCommas(number * -1));

    string temp = to_string(number);
    unsigned int numLength = temp.find('.');

    temp.reserve((numLength - 1) / 3 + numLength);
    for (unsigned int i = 1; i <= (numLength - 1) / 3; i++)
        temp.insert(numLength - i * 3, 1, ',');

    return temp;
}

在我的方法文件中,我为每种数据类型都重载了函数,以避免与隐式转换混淆。比如:

inline std::string printWithCommas(int number);
inline std::string printWithCommas(long int number);
inline std::string printWithCommas(long long int number);

inline std::string printWithCommas(unsigned int number);
inline std::string printWithCommas(long unsigned int number);
inline std::string printWithCommas(long long unsigned int number);

inline std::string printWithCommas(float number);
inline std::string printWithCommas(double number);
inline std::string printWithCommas(long double number);

【讨论】:

  • 我已经对它进行了相当多的测试,如果您发现任何问题,它应该只是在插入的位置逻辑上。如果我找到任何东西,我会编辑
  • printWithCommas(-100) 看起来有点可疑。
  • 您还可以指定区域设置。在这里这样做的体面答案:stackoverflow.com/a/7277333/4581301
  • 是的,令人惊讶的是忘记用负片进行测试,fml
猜你喜欢
  • 2018-12-20
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2015-08-27
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多