Namespaces
Variants

std:: num_get

From cppreference.net
헤더에 정의됨 <locale>
template <

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

> class num_get ;

클래스 std::num_get 는 숫자 값의 문자열 표현을 파싱하기 위한 규칙을 캡슐화합니다. 구체적으로, bool , unsigned short , unsigned int , long , unsigned long , long long , unsigned long long (C++11부터) , float , double , long double , 그리고 void * 타입이 지원됩니다. 표준 형식화 입력 연산자들(예: cin >> n ; )은 숫자의 텍스트 표현을 파싱하기 위해 I/O 스트림의 로캘의 std::num_get 패싯을 사용합니다.

cpp/locale/locale/facet std-num get-inheritance.svg

상속 다이어그램

만약 std::num_get 특수화가 표준 라이브러리에서 제공된다는 보장이 없는 경우(아래 참조), 해당 get() do_get() 함수의 동작은 명세된 대로 보장되지 않습니다.

목차

특수화

표준 라이브러리는 다음과 같은 특수화를 제공함을 보장합니다 (이들은 모든 locale 객체에 의해 구현되어야 하는 요구사항 입니다):

헤더 파일에 정의됨 <locale>
std :: num_get < char > 좁은 문자열 숫자 파싱을 생성함
std :: num_get < wchar_t > 넓은 문자열 숫자 파싱을 생성함

또한, 표준 라이브러리는 다음 타입 요구사항을 충족하는 모든 특수화를 제공하는 것도 보장됩니다:

중첩 타입

유형 정의
char_type CharT
iter_type InputIt

데이터 멤버

멤버 설명
std::locale::id id [static] facet 의 식별자

멤버 함수

새로운 num_get 패싯을 생성함
(public member function)
do_get 을 호출함
(public member function)

보호된 멤버 함수

num_get 패싯을 파괴함
(protected member function)
[virtual]
입력 스트림에서 숫자를 파싱함
(virtual protected member function)

예제

#include <iostream>
#include <iterator>
#include <locale>
#include <sstream>
#include <string>
int main()
{
    std::string de_double = "1.234.567,89";
    std::string us_double = "1,234,567.89";
    // 스트림을 사용한 파싱
    std::istringstream de_in(de_double);
    de_in.imbue(std::locale("de_DE.UTF-8"));
    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";
    // facet 직접 사용
    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';
}

출력:

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

결함 보고서

다음 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 수정된 동작
LWG 427 C++98 num_get 은 모든 CharT 를 수락하도록
보장되었으며, 이는 iostream 구성 요소가
인스턴스화될 수 있는 모든 문자 요구사항을 충족
char ,
wchar_t 및 구현 정의
문자 타입만 수락하도록 보장
LWG 2392 C++98 문자 타입 CharT 만이
num_get 에 의해 수락될 수 있음이 보장됨
구현 정의 문자 컨테이너 타입
수락을 보장할 수 있음

참고 항목

숫자 구두점 규칙을 정의함
(클래스 템플릿)
숫자 값을 문자 시퀀스로 출력하기 위해 형식화함
(클래스 템플릿)
형식화된 데이터를 추출함
( std::basic_istream<CharT,Traits> 의 public 멤버 함수)