Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/locale/num get"

From cppreference.com
< cpp‎ | locale
m (Update links.)
(ce)
Line 11: Line 11:
 
{{dcl end}}
 
{{dcl end}}
  
Class {{tt|std::num_get}} encapsulates the rules for parsing string representations of values of type {{c|bool}}, {{c|unsigned short}}, {{c|unsigned int}}, {{c|long}}, {{c|unsigned long}}, {{c|long long}}, {{c|unsigned long long}}, {{c|float}}, {{c|double}}, {{c|long double}}, and {{c|void*}}. The standard formatting input operators (such as {{c|cin >> n;}}) use the {{tt|std::num_get}} facet of the I/O stream's locale to parse the text representations of the numbers.
+
Class {{tt|std::num_get}} encapsulates the rules for parsing string representations of numeric values. Specifically, types {{c|bool}}, {{c|unsigned short}}, {{c|unsigned int}}, {{c|long}}, {{c|unsigned long}}, {{c|long long}}, {{c|unsigned long long}}, {{c|float}}, {{c|double}}, {{c|long double}}, and {{c|void*}} are supported. The standard formatting input operators (such as {{c|cin >> n;}}) use the {{tt|std::num_get}} facet of the I/O stream's locale to parse the text representations of the numbers.
  
 
{{inheritance diagram/std-num_get}}
 
{{inheritance diagram/std-num_get}}

Revision as of 21:10, 25 June 2013

 
 
 
 
Defined in header <locale>
template<

    class CharT,
    class InputIt = std::istreambuf_iterator<CharT>

> class num_get;

Class std::num_get encapsulates the rules for parsing string representations of numeric values. Specifically, types bool, unsigned short, unsigned int, long, unsigned long, long long, unsigned long long, float, double, long double, and void* are supported. The standard formatting input operators (such as cin >> n;) use the std::num_get facet of the I/O stream's locale to parse the text representations of the numbers.

cpp/locale/locale/facetstd-num get-inheritance.svg

Inheritance diagram

Contents

Type requirements

Template:par req concept

Specializations

Two specializations and two partial specializations are provided by the standard library and are implemented by all locale objects created in a C++ program:

Defined in header <locale>
std::num_get<char> creates narrow string parsing of numbers
std::num_get<wchar_t> creates wide string parsing of numbers
std::num_get<char, InputIt> creates narrow string parsing of numbers using custom input iterator
std::num_get<wchar_t, InputIt> creates wide string parsing of numbers using custom input iterator

Member types

Member type Definition
char_type CharT
iter_type InputIt

Member functions

constructs a new num_get facet
(public member function)
destructs a num_get facet
(protected member function)
invokes do_get
(public member function)

Member objects

static std::locale::id id
id of the locale
(public member object)

Protected member functions

[virtual]
parses a number from an input stream
(virtual protected member function)

Example

#include <iostream>
#include <locale>
#include <string>
#include <sstream>
#include <iterator>
int main()
{
    std::string de_double = "1.234.567,89";
    std::string us_double = "1,234,567.89";
 
    // parse using streams
    std::istringstream de_in(de_double);
    de_in.imbue(std::locale("de_DE"));
    double f1;
    de_in >> f1;
 
    std::istringstream us_in(de_double);
    us_in.imbue(std::locale("en_US.UTF-8"));
    double f2;
    us_in >> f2;
 
    std::cout << "Parsing " << de_double << " as double gives " << std::fixed
              << f1 << " in de_DE locale and " << f2 << " in en_US\n";
 
    // use the facet directly
    std::istringstream s3(us_double);
    s3.imbue(std::locale("en_US.UTF-8"));
    auto& f = std::use_facet<std::num_get<char>>(s3.getloc());
    std::istreambuf_iterator<char> beg(s3), end;
    double f3;
    std::ios::iostate err;
    f.get(beg, end, s3, err, f3);
    std::cout << "parsing " << us_double
              << " as double using raw en_US facet gives " << f3 << '\n';
}

Output:

Parsing 1.234.567,89 as double gives 1234567.890000 in de_DE locale and 1.234000 in en_US
parsing 1,234,567.89 as double using raw en_US facet gives 1234567.890000

See also

defines numeric punctuation rules
(class template) [edit]
formats numeric values for output as character sequence
(class template) [edit]
extracts formatted data
(public member function of std::basic_istream<CharT,Traits>) [edit]