Create a copy of the user"s locale
#include <iostream>
#include <locale>
#include <string>
using namespace std;
int main( ) {
locale loc(""); // Create a copy of the user"s locale
cout << "Locale name = " << loc.name( ) << endl;
cout.imbue(loc); // Tell cout to use the formatting of
// the user"s locale
cout << "pi in locale " << cout.getloc( ).name( ) << " is "
<< 3.14 << endl;
}
Locale name = C
pi in locale C is 3.14
Format numeric values relative to a locale.
#include <iostream>
#include <locale>
#include <iomanip>
using namespace std;
int main()
{
// Use a fixed format with 2 decimal places.
cout << fixed << setprecision(2);
cout << "Default format: " << 12345678.12 << "\n\n";
// Set the locale to English.
locale eloc("English");
cout.imbue(eloc);
cout << "English format: " << 12345678.12 << "\n\n";
locale gloc("German");
cout.imbue(gloc);
cout << "German format: " << 12345678.12 << "\n\n";
return 0;
}
Get a moneypunct facet for cout for a locale
#include <iostream>
#include <locale>
using namespace std;
int main()
{
// Create a locale for US English.
locale usloc("English_US");
// Set the locale of cout to US English.
cout.imbue(usloc);
// Get a moneypunct facet for cout.
const moneypunct<char> &us_monpunct = use_facet<moneypunct<char> >(cout.getloc());
cout << " Currency symbol: " << us_monpunct.curr_symbol() << endl;
cout << " Decimal point: " << us_monpunct.decimal_point() << endl;
cout << " Thousands separator: " << us_monpunct.thousands_sep() << endl;
cout << " Fraction digits: " << us_monpunct.frac_digits() << endl;
cout << " Number of grouping rules: " << us_monpunct.grouping().size() << endl;
for(unsigned i=0; i < us_monpunct.grouping().size(); ++i)
cout << " Size of group " << i << ": "
<< (int)us_monpunct.grouping()[0] << endl;
cout << endl;
return 0;
}
Get numeric input facet of the locale loc and read value with numeric input facet
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <locale>
#include <iostream>
#include <cstdlib>
#include <iterator>
int main()
{
// create copy of current global locale
std::locale loc;
// iterator to read from standard input
typedef std::istreambuf_iterator<char> InIt;
InIt beg = InIt(std::cin);
InIt end = InIt();
// stream which defines input format
std::ios_base& fmt = std::cin;
// declare output arguments
std::ios_base::iostate err;
float value;
// get numeric input facet of the locale loc
std::num_get<char, InIt> const& ng
= std::use_facet<std::num_get<char, InIt> >(loc);
// read value with numeric input facet
ng.get(beg, end, fmt, err, value);
// print value or error message
if (err == std::ios_base::goodbit) {
std::cout << "value: " << value << "\n";
}
else if (err == std::ios_base::eofbit) {
std::cout << "value: " << value << " (EOF encountered)\n";
}
else if (err & std::ios_base::badbit) {
std::cerr << "fatal error while reading numeric value\n";
return EXIT_FAILURE;
}
else if (err & std::ios_base::failbit) {
std::cerr << "format error while reading numeric value\n";
return EXIT_FAILURE;
}
}
us
format error while reading numeric value
Make a new locale and attach it to the standard output stream
#include <iomanip>
#include <iostream>
#include <locale>
using namespace std;
class Separator_facet: public numpunct<char>
{
public:
explicit Separator_facet( size_t refs = 0): numpunct<char>( refs ){}
protected:
virtual string do_grouping() const{ return "\3"; }
};
int main()
{
const int million = 1000000;
const double number = 1234.56789;
cout << million << fixed << setprecision( 5 ) << number;
locale separator_locale( cout.getloc(), new Separator_facet );
cout.imbue( separator_locale );
cout << million << " " << number << endl;
}
Money format for US dollars
#include <iostream>
#include <locale>
using namespace std;
int main()
{
double balance = 1234.56;
locale usloc("English_US");
locale gloc("German_Germany");
cout << showbase;
cout.imbue(usloc);
const money_put<char> &us_mon = use_facet<money_put<char> >(cout.getloc());
us_mon.put(cout, false, cout, " ", "123456");
us_mon.put(cout, true, cout, " ", -299);
us_mon.put(cout, false, cout, " ", balance * 100);
return 0;
}
Process the name of the locale and read input
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>
#include <locale>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
// create the default locale from the user"s environment
locale langLocale("");
// and assign it to the standard ouput channel
cout.imbue(langLocale);
// process the name of the locale
bool isGerman;
if (langLocale.name() == "de_DE" ||
langLocale.name() == "de" ||
langLocale.name() == "german") {
isGerman = true;
}
else {
isGerman = false;
}
// read locale for the input
if (isGerman) {
cout << "Sprachumgebung fuer Eingaben: ";
}
else {
cout << "Locale for input: ";
}
string s;
cin >> s;
if (!cin) {
if (isGerman) {
cerr << "FEHLER beim Einlesen der Sprachumgebung"
<< endl;
}
else {
cerr << "ERROR while reading the locale" << endl;
}
return EXIT_FAILURE;
}
locale cinLocale(s.c_str());
// and assign it to the standard input channel
cin.imbue(cinLocale);
// read and output floating-point values in a loop
double value;
while (cin >> value) {
cout << value << endl;
}
}
Locale for input: US
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application"s support team for more information.
show money in international German format
#include <iostream>
#include <locale>
using namespace std;
int main()
{
double balance = 5467.87;
locale usloc("English_US");
locale gloc("German_Germany");
cout << showbase;
cout.imbue(usloc);
const money_put<char> &us_mon = use_facet<money_put<char> >(cout.getloc());
cout << "Now show money in international German format:\n";
cout.imbue(gloc);
const money_put<char> &g_mon = use_facet<money_put<char> >(cout.getloc());
g_mon.put(cout, true, cout, " ", 123456);
cout << endl;
g_mon.put(cout, true, cout, " ", -299);
cout << endl;
g_mon.put(cout, true, cout, " ", balance * 100);
return 0;
}
Use a German locale to write data to standard ouput
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>
#include <locale>
using namespace std;
int main()
{
// use classic C locale to read data from standard input
cin.imbue(locale::classic());
// use a German locale to write data to standard ouput
cout.imbue(locale("de_DE"));
// read and output floating-point values in a loop
double value;
while (cin >> value) {
cout << value << endl;
}
}
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application"s support team for more information.