右对齐money_put结果

时间:2015-09-29 22:00:59

标签: c++

我试图让C ++库生成格式正确的USD输出($ sign,每1000个地方使用逗号等)。

我已经关闭,但我无法正确对齐工作:

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

using namespace std;

int main() {
   double fiftyMil = 50000000.0; // 50 million bucks
   locale myloc;
   const money_put<char>& mpUS = use_facet<money_put<char> >(myloc);
   cout.imbue(myloc);

   cout << showbase << fixed;
   cout << "A";
   cout.width(30);
   cout.setf(std::ios::right);
   mpUS.put(cout, false, cout, ' ', fiftyMil * 100); // convert to cents
   cout << "B" << endl;

   return 0;
}

我得到了:

A$50,000,000.00                             B

我想得到:

A                             $50,000,000.00B

为什么这不起作用的任何想法?

我使用的是最新的Solaris编译器(12.4)

更新 似乎问题出在Solaris编译器附带的C ++库中。这是我使用的解决方法:

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

using namespace std;

string getFormattedCcy(double amt) {
   ostringstream os;
   static locale myloc;
   static const money_put<char>& mpUS = use_facet<money_put<char> >(myloc);
   os.imbue(myloc);

   os << showbase << fixed;
   mpUS.put(os, false, os, ' ', amt * 100);
   return os.str();
}

int main() {
   double fiftyMil = 50000000.0; // 50 million bucks

   cout << "A";
   cout.setf(std::ios::right);
   cout.width(30);
   cout << getFormattedCcy(fiftyMil);
   cout << "B" << endl;

   return 0;
}

1 个答案:

答案 0 :(得分:0)

您遇到了一些问题 - 一个是您的代码,另一个类似于您的实现。

代码中的问题非常简单。由于您使用的是默认构建的语言环境,因此它应该使用&#34; C&#34;语言环境,不应该写出$或数千个分隔符。

这部分很容易修复。更改:locale myloc;到:locale myloc("");以获取本地化的区域设置(可以这么说)。

怀疑会解决你所看到的理由问题。在我看来,这与您正在使用的标准库存在问题。当我运行你的代码时(上面的修正)我得到了我所期望的:

A                $50,000,000.00B

虽然使用了Visual C ++(尽管编译器的性能相当差,但它的标准库与它们一样好)。

另请注意,右对齐是默认值,因此行:

cout.setf(std::ios::right);

... 应该没有效果(但我怀疑你知道这一点,并希望在没有效果的情况下让它发挥作用)。

至于如何使用 Sun Oracle编译器工作,最明显的建议可能是将标准库切换为效果更好的库。这导致了另一个问题:是否尝试使用标准库来使用您正在使用的编译器,或者切换到不同的编译器,例如CLang或gcc。根据我的理解,12.4在C ++一致性方面是一个相当严重的改进,但我不认为编译器或(显然)标准库与gcc或Clang真正竞争。 OTOH,您可能没有选择,在这种情况下,基本上您唯一的途径是使用现有编译器构建不同的标准库,并希望最好。如果你甚至不能这样做......你可以尝试正确设置语言环境,只需用std::cout << fiftyMil;编写数字,并希望它至少给你逗号,然后添加货币符号分开。

顺便说一句,如果你得到一个更新的(C ++ 11或更新版本)库,你可以使用put_money来简化代码:

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

using namespace std;

int main() {
    double fiftyMil = 50000000.0; // 50 million bucks
    std::locale myloc("");
    cout.imbue(myloc);
    cout << "A" << showbase << setw(30) << put_money(fiftyMil * 100) << "B";
}