Namespaces
Variants

std::money_get<CharT,InputIt>:: get, do_get

From cppreference.net
std::money_get
Member functions
money_get::get money_get::do_get
헤더에 정의됨 <locale>
public :

iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(1)
iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(2)
protected :

virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(3)
virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(4)

입력 반복자에서 화폐 값을 파싱하고 결과를 long double 또는 문자열에 기록합니다.

1,2) 공개 멤버 함수들, 가장 파생된 클래스의 멤버 함수 do_get 를 호출합니다.
3,4) 입력 반복자 beg 로부터 문자를 읽어들여, std:: ctype 패싯이 주입된 str. getloc ( ) ( ct 로 이 페이지에서 지칭)에 지정된 규칙, std:: moneypunct < CharT, intl > 패싯이 주입된 str. getloc ( ) ( mp 로 이 페이지에서 지칭)에 지정된 규칙, 그리고 str. flags ( ) 에서 얻은 스트림 서식 플래그에 따라 형식화된 통화 값을 찾을 것으로 예상합니다.

입력 반복자 beg 가 파싱이 완료되기 전에 end 와 같아지면, err 에서 failbit eofbit 를 모두 설정합니다. 다른 이유로 파싱이 실패하면, err 에서 failbit 을 설정합니다. 어느 경우든 오류 시 출력 매개변수( units 또는 digits )는 수정하지 않습니다.

파싱이 성공하면, err 를 변경하지 않고 결과를 units 또는 digits 에 저장합니다.

이 함수가 사용하는 서식 pattern 은 항상 mp. neg_format ( ) 입니다.

만약 mp. grouping ( ) 가 천 단위 구분자를 허용하지 않으면, 처음 발견된 구분자는 파싱 오류로 처리됩니다. 그렇지 않으면 구분자는 선택적으로 처리됩니다.

만약 money_base::space 또는 money_base::none pattern 의 마지막 요소라면, 파서는 화폐 값의 다른 구성 요소들을 파싱한 후 추가 공백을 소비하려고 시도하지 않습니다. 그렇지 않으면, money_base::space 가 나타나는 위치에서 하나 이상의 공백 문자를 소비합니다.

만약 showbase 플래그가 str. flags ( ) 에 설정되어 있으면 통화 기호나 통화 문자열이 필수이며, 설정되어 있지 않으면 통화 기호는 선택 사항입니다.

mp. positive_sign ( ) 또는 mp. negative_sign ( ) 에 의해 반환된 문자열의 첫 번째 문자가 형식 패턴의 money_base::sign 위치에서 발견되면, 해당 문자는 소비되며 해당 문자열의 나머지 문자들은 통화 값의 다른 모든 구성 요소 이후에 예상되고 소비됩니다. 만약 mp. positive_sign ( ) mp. negative_sign ( ) 모두 비어있지 않으면, 부호는 필수이며 이 문자열들 중 하나의 첫 번째 문자와 일치해야 합니다. 만약 이 문자열들 중 하나가 비어 있으면, 부호는 선택 사항입니다(그리고 부호가 없을 경우 결과의 부호는 비어 있었던 문자열에 해당합니다). 두 문자열이 모두 비어 있거나 동일한 첫 번째 문자를 가지면 결과는 양수 부호를 갖습니다. 출력 매개변수가 문자열( digits )이고 결과가 음수이면, 값 ct. widen ( '-' ) 이 결과의 첫 번째 문자로 저장됩니다.

입력에서 숫자는 나타나는 순서대로 추출되어 digits 에 배치됩니다 (필요한 경우 ct. widen ( ) 를 통해 확장한 후), 또는 임시 버퍼 buf1 에 배치되며, 여기서 units 의 값은 다음과 같이 구성됩니다

static const char src[] = "0123456789-";
CharT atoms[sizeof(src)];
ct.widen(src, src + sizeof(src) - 1, atoms);
for (int i = 0; i < n; ++i)
buf2[i] = src[find(atoms, atoms+sizeof(src), buf1[i]) - atoms];
buf2[n] = 0;
sscanf(buf2, "%Lf", &units);

(여기서 n 은 입력에서 추출되어 buf1 에 저장된 문자 수이며, buf2 는 또 다른 충분히 큰 문자 버퍼입니다).

목차

반환값

통화 문자열 입력의 유효한 부분으로 인식된 마지막 문자 바로 다음을 가리키는 반복자입니다.

참고 사항

통화 단위는 통화의 가장 작은 비분할 단위로 가정됩니다: 미국에서는 센트, 일본에서는 엔. 따라서 미국 로캘에서 입력 시퀀스 "$1,056.23" 105623.0 숫자를 units 에 생성하거나 문자열 "105623" digits 에 생성합니다.

showbase 가 꺼져 있을 때 통화 기호는 선택 사항이지만 전체 다중 문자 negative_sign() 은 필수이므로, 서식 패턴 { sign, value, space, symbol } 에서 showbase 가 꺼져 있고 negative_sign이 "-" 인 경우, 문자열 "-1.23 €" - 123 로 파싱되고 "€"는 입력 스트림에서 소비되지 않은 채 남지만, negative_sign이 "()" 인 경우 문자열 "(1.23 €)" 는 완전히 소비됩니다.

I/O 조작자 std::get_money 는 이 함수에 대한 더 간단한 인터페이스를 제공합니다.

예제

#include <iostream>
#include <locale>
#include <sstream>
void demo_money_get(std::locale loc, const std::string& input)
{
    std::istringstream str(input);
    str.imbue(loc);
    long double units;
    // 다음은 std::get_money(units)로 더 간단하게 작성할 수 있습니다
    std::ios_base::iostate err = std::ios_base::goodbit;
    std::istreambuf_iterator<char> ret =
        std::use_facet<std::money_get<char>>(loc).get(
            std::istreambuf_iterator<char>(str),
            std::istreambuf_iterator<char>(),
            false, str, err, units);
    str.setstate(err);
    std::istreambuf_iterator<char> last{};
    if (str)
    {
        std::cout << "Successfully parsed '" << str.str() << "' as "
                  << units / 100 << " units\n";
        if (ret != last)
        {
            std::cout << "Remaining content: '";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
            std::cout << "'\n";
        }
        else
            std::cout << "The input was fully consumed\n";
    }
    else
    {
        std::cout << "Parse failed. Unparsed string: '";
        std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
        std::cout << "'\n";
    }
}
int main()
{
    demo_money_get(std::locale("en_US.utf8"), "-$5.12 abc");
    demo_money_get(std::locale("ms_MY.utf8"), "(RM5.12) def");
}

출력:

Successfully parsed '-$5.12 abc' as -5.12 units
Remaining content: ' abc'
Successfully parsed '(RM5.12) def' as -5.12 units
Remaining content: ' def'

참고 항목

std::money_get std::money_put 에서 사용되는 통화 서식 매개변수를 정의함
(클래스 템플릿)
입력 문자 시퀀스에서 통화 값을 구문 분석하고 구성함
(클래스 템플릿)
(C++11)
통화 값을 구문 분석함
(함수 템플릿)