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+.+563
即 1.563
我的问题是这样做很难看,我想知道是否有更好的方法。我在 google 上搜索并找到了 imbue
和 locale
,但它们仅用于 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();
#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());
我正在 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+.+563
即 1.563
我的问题是这样做很难看,我想知道是否有更好的方法。我在 google 上搜索并找到了 imbue
和 locale
,但它们仅用于 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();
#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
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());