C ++格式化int数字以用点分隔千位

C++ format int numbers to separate thousands with a dot

我正在 Fedora 上研究 Eclipse。我想让一个数字更容易理解,使用一个点来分隔千位。这个数字是一个整数值,可以是0<Value<99.999

所以...如果 Value = 1000 它显示 1000 而我想要的是显示 1.000 (注意点)。我需要更改的代码是下一个:

char str[12];
sprintf(str, "%d", (int)(Value));
m_Text.SetText(str); 

我想做的是:

if (Value > 999) 
{
 int RightPart = (int)Value % 1000;
 int LeftPart = Val/1000 ;
}

然后追加一个字符串 LeftPart + "." + RightPart 所以如果 Value = 1563 它将是 1+.+5631.563

我的问题是这样做很难看,我想知道是否有更好的方法。我在 google 上搜索并找到了 imbuelocale,但它们仅用于 cout。我也看过一些像 this and this 这样的帖子,但这对我的问题没有帮助。

谢谢。

注意:我想说明我不想更改输出格式。我想更改我收到的 int,这样我就可以在 str var 中添加点,稍后我将使用这些点。

注意 2:代码基本上必须:接收一个整数(值),并将其像字符串一样发送到 setText()。 setText() 基本上会在需要的地方和时间将其打印在屏幕上,我希望它打印 1.563 而不是 1563,后者更难阅读。

使用 stringstream 和相同的灌注技术。

例如:

struct dotted : std::numpunct<char> {
    char do_thousands_sep()   const { return '.'; }  // separate with dots
    std::string do_grouping() const { return ""; } // groups of 3 digits
    static void imbue(std::ostream &os) {
        os.imbue(std::locale(os.getloc(), new dotted));
    }
};

然后:

    std::stringstream ss;
    dotted::imbue(ss);
    ss << Value;
    std::cout << ss.str();

Demo

#include <iomanip>
#include <locale>
#include <iostream>
#include <sstream>

using namespace std;

template<class T>
string format(T value)
{
    stringstream ss;
    ss.imbue(locale(""));
    ss << fixed << value;
    return ss.str();
}


int main(int argc, char argv[])
{
    cout.imbue(locale(""));
    cout << 1000000 << endl;

    return 0;
}

打印:

1.000.000

您可能应该查看传递“”时使用的语言环境,然后将其更改为更合适的语言环境。

反之亦然:

int str_to_nr(string str)
{
    int val;

    stringstream ss(str);
    ss.imbue(locale(""));
    ss >> val;

    return val;
}


int main(int argc, char argv[])
{
    cout << str_to_nr("1.000") << endl;

    return 0;
}

打印:

1000

基本上为您提供了一种使用 C++ 流按需打印点值的技术。

sprintf(顺便说一句,通常使用起来不安全)是一个 C 库函数。 C 不提供以 C++ 提供的相同方式改变语言环境行为的机制。在 C 语言中,您必须使用操作系统提供的 mechanisms/tools 定义语言环境行为并为其分配一个名称。然后,您可以使用 C 函数 setlocale 将程序中的语言环境更改为您创建的语言环境,以使其按您想要的方式打印。 但是,这只适用于安装了您创建的语言环境的机器。它不会在任何其他机器上运行。

只需一点点工作,几乎不需要创造性的努力,您就可以使用已经提供的 C++ 解决方案并调用 sprintf

char str[12];
stringstream ss;
dotted::imbue(ss);
ss << Value;
sprintf(str, "%s", ss.str());
m_Text.SetText(str);

但是,真的没有理由使用 sprintf:

stringstream ss;
dotted::imbue(ss);
ss << Value;
m_Text.SetText(ss.str());