C ++格式int数字用数字分隔数千

时间:2015-07-27 14:58:50

标签: c++ int format

我正在使用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

我的问题是这样做非常难看,我想知道是否有更好的方法。我在谷歌搜索过,发现imbuelocale,但他们只是为了cout。我也看到过thisthis等帖子,但这对我的问题没有帮助。

谢谢。

注意:我想说我不想改变输出格式。我想改变我收到的int,所以我可以在str var中得到点,稍后我会用它。

注2:基本上代码必须:接收整数(Value),并将其像字符串一样发送到setText()。 setText()基本上会在屏幕上将它打印到何时何地,我希望它打印1.563而不是1563,这更难以阅读。

3 个答案:

答案 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));
    }
};

Demo

答案 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());