我正在使用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
我的问题是这样做非常难看,我想知道是否有更好的方法。我在谷歌搜索过,发现imbue
和locale
,但他们只是为了cout。我也看到过this和this等帖子,但这对我的问题没有帮助。
谢谢。
注意:我想说我不想改变输出格式。我想改变我收到的int,所以我可以在str var中得到点,稍后我会用它。
注2:基本上代码必须:接收整数(Value),并将其像字符串一样发送到setText()。 setText()基本上会在屏幕上将它打印到何时何地,我希望它打印1.563而不是1563,这更难以阅读。
答案 0 :(得分:5)
使用run_from_file () {
if IFS= read -r newarg; then
run_from_file "$@" "$newarg"
else
"$MYCOMMAND" "$@"
fi
}
run_from_file < myinput.txt
和相同的imbue技术。
例如:
stringstream
然后:
struct dotted : std::numpunct<char> {
char do_thousands_sep() const { return '.'; } // separate with dots
std::string do_grouping() const { return "\3"; } // groups of 3 digits
static void imbue(std::ostream &os) {
os.imbue(std::locale(os.getloc(), new dotted));
}
};
答案 1 :(得分:1)
#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
你应该看看&#34;&#34;&#34;&#34;&#34;&#34;&#34;被传递并用更合适的一个来改变它。
反之亦然:
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
答案 2 :(得分:0)
@gandgandi's answer基本上为您提供了一种技术,可以使用C ++流按需点打印出值。
sprintf
(通常不安全使用,BTW)是C库函数。 C不提供以与C ++提供的方式相同的方式来改变语言环境行为的机制。在C中,您必须使用操作系统提供的机制/工具定义语言环境行为,并为其指定名称。然后,您可以使用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());