类monetary包含moneypunct、money_get和money_put3个刻面。其中moneypunct用于定义货币格式,另外两个刻面使用该格式信息解析货币值。
1.货币符号
货币值在不同的场合中以不同的格式被打印出来。不同的文化社群所习惯的格式之间存在非常大的差异。例如货币符号的布置、负值或正值的记法、国家或国际货币符号的使用、千位分隔符等。为了具有必要的灵活性,格式细节被存放在moneypunct刻面中。
moneypunct刻面是一个模板,接受一个字符型别的charT和一个默认值为false的布尔值。该布尔值表示将运用本地的或国际的货币符号。表12-25列出了moneypunct刻面的成员函数。
表12-25 moneypunctfacet刻面的成员函数
moneypunct派生自类money_base,此基类定义了一个名为part的枚举量,用以形成货币形式。此基类还定义了pattern型别,用来存储型别为part的4个值,进而形成一个样式,用以描述货币布局方式。表12-26列出了可以放进样式中的5种可能的parts。
表12-26 货币布局样式的局部内容
moneypunct刻面定义了两个函数,用于返回样式:neg_format()专门针对负值,pos_for-mat()专门针对非负值。对于一个样式,sign、symbol和value是必要的。none和space二者必须出现其一,此时并不意味着会打印一个正号或负号。parts所指之处要打印什么,要根据刻面其他成员的返回值以及格式化函数传送过来的格式化标志决定。
在输出打印货币值时,其格式是由value在样式中出现的位置决定的。货币值小数的位数由frac_digits()指定,货币值的小数点表示字符由decimal_point()确定。
读取货币,允许分隔千位符存在,但不会强制要求。若确实存在,需要根据grouping()检查“分组布局”的正确性。若grouping()为空,则不允许出现千位分隔符。千位分隔符字符可由thousands_sep()返回。千位分隔符的布局规则和数值格式化的情形是一样的。打印货币值时,要根据grouping()返回的字符串插入和打印千位分隔符字符。一旦所有其他解析工作完成,便可检查出千位分隔符布局是否正确。
space和none主要用于控制空白的布置。space用于至少需要一个空白的位置。格式化时,若格式标识中指定ios_base::internal,则填充字符会被插入到space或none部分。当然,只有在指定的最小宽度没有使用其他字符时,填充才会产生。“被用于作为空格符”的填充字符应该以参数形式传给格式化函数。若格式化的货币值不包含空白,none可以被放在最后一个位置。space和none不能出现在样式的第一部分。space不能出现在样式的最后一部分。
货币值的正负符号可由一个以上的字符表示。例如,某些场合用括号括起的一个值可表示为负值。样式中sign是正负号第一个字符出现的位置,其余所有正负号相关字符均出现在其他组件之后。若正负号字符串为空,则可不以任何符号指示正负。positive_sign()和negative_sign()这两个函数用于决定正负号字符,positive_sign()对应正号,negative_sign()对应负号。
symbol位置上会出现货币符号。在格式化过程和解析过程中ios_base::showbase标识被设立的情况下,此符号才有效。货币符号由curr_symbol()函数返回的字符串确定,此为当地符号——若第二个模板参数为false,便以它来表示货币;否则,将使用国际货币符号。
C++标准要求每个类locale中都必须有两个实例化对象:moneypunct<char>和money-punct<wchar_t>。除此之外,C++标准程序库不支持其他任何形式的实例化对象。
2.货币的格式化(www.xing528.com)
money_punct刻面可以用于格式化货币值。它是一个模板类,接受字符型别charT作为第一个模板参数,接受输出型迭代器型别OutIt作为第二个模板参数。输出型迭代器的默认类型为ostreambuf_iterator<charT>。货币样式的例子见表12-27。
成员put()函数有两种形式,用以根据moneypunct刻面指定的格式产生一个字符序列。被格式化的数值或以long double传递,或以basic_string<charT>传递。
表12-27 货币样式的例子
下面是简例:
其中参数to是一个型别为OutIt的输出型迭代器(格式化后的字符串会写到该处)。put()函数返回该型对象,指向“生成的最后一个字符”的下一位置。参数intl表示使用当地货币符号或国际货币符号。fmt用于确定格式化标识,例如宽度和moneypunct facet刻面。fill为填充字符。参数value的型别是long double或basic_string<charT>,其内容即为待被格式化的值。若传入的是字符串,此字符串可以全部由小数组成,前面可以带上负号。若字符串的第一个字符是个负号,则该值将依负值形式加以格式化。若确定其值为负值,则负号即可被丢弃。字符串中的小数个数可以由moneypunct facet的成员函数frac_digits()确定。
C++标准要求每个类locale中必须有两个实例化对象:money_put<char>和money_put<wchar_t>。此外,C++标准程序库还支持“第一个模板参数为char或wchar_t,第二个模板参数为相应的output迭代器”的所有money_put< >实例化对象,但不要求每个类locale必须拥有它们。
3.货币解析
facet money_get刻面用于解析货币值。它是一个模板类,接受字符型别charT作为第一个模板参数,接受输入型迭代器型别InIt作为第二个模板参数。此类别定义了两个get()成员函数,用于解析一个字符序列。若解析成功,则结果会被储存为long double型别或basic_string<charT>型别。例如,
被解析的是beg和end之间的字符序列。当所有元素均可被解析完毕,或是解析过程中遇到错误时,解析动作即可停止。若发生错误,err将设立ios_base::failbit,而val中将不会有任何东西。若解析成功,其结果放在参数val中,型别为long double或basic_string。
参数intl是布尔量值,用于选定当地货币字符串或国际货币字符串。通过“参数fmt渗入”的locale对象,获取一个moneypunct刻面。该刻面用于定义出待解析的格式。对于货币的解析而言,moneypunct刻面的成员函数neg_format()所返回的样式始终会被使用。
在none或space位置上,货币解析函数会吞噬所有有效空白,除非none是样式的最后一部分。尾部空白不会被忽略。get()函数会返回一个迭代器。该迭代器指向最后一个被吞噬字符的下一位置。
C++标准要求每个类locale内均必须有两个实例化对象:money_get<char>和money_get<wchar_t>。此外,C++标准程序库要求支持所有“第一个模板参数为char或wchar,第二个模板参数为相应的输入型迭代器”的money_get< >实例化对象,但不要求每个类locale必须拥有它们。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。