我试图让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;
}
答案 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";
}