strfmon ()- 将货币值转换为字符串
格式
#include <monetary.h>
int strfmon(char *s, size_t maxsize, const char *format, argument_list);语言级别
XPG4
线程安全
是
语言环境敏感
此函数的行为可能受当前语言环境的 LC_CTYPE 和LC_货币类别影响。 当在编译命令上指定 LOCALETYPE (*CLD) 时,此功能不可用。 有关更多信息,请参阅 了解 CCSID 和语言环境。
描述
strfmon() 函数将字符放入 s 所指向的数组中,如 format所指向的字符串所控制。 将不超过 maxsize 个字符放入数组中。
字符串 format 包含两种类型的对象: 纯字符 (复制到输出流中) 和伪指令 (每种对象都导致访存零个或多个自变量,这些自变量将进行转换和格式化)。 如果没有足够的自变量用于格式,那么将取消定义结果。 如果在保留自变量时耗尽格式,那么将忽略多余的自变量。 涉及双精度值的转换仅保证 15 个有效数字。
伪指令由% 字符,可选转换规范和用于确定伪指令行为的结束字符组成。
伪指令由以下序列组成:
- % 字符。
- 可选标志。
- 可选字段宽度。
- 可选的左精度。
- 可选的右精度。
- 指示要执行的转换类型的必需转换字符。
标志
| 标志 | 含义 |
|---|---|
| = f | = 后跟用作数字填充字符的单个字符 f 。 缺省情况下,数字填充字符是空格字符。 此标志不影响始终使用空格字符的字段宽度填充。 除非指定了左精度,否则将忽略此标志。 |
| ^ | 格式化货币值时,请勿使用分组字符。 缺省值是插入当前语言环境中定义的分组字符。 |
| + 或 ( | 指定表示正货币金额和负货币金额的样式。 如果指定了 + ,那么将使用语言环境的货币数量的 + 和-等值。 如果指定了 ( ) ,那么会将负数括在括号内。 缺省值为 +。 |
| ! | 不输出货币符号。 缺省值是输出货币符号。 |
| - | 对双参数使用左对齐。 缺省值是正确的理由。 |
字段宽度
- w
- 十进制数字字符串 w ,用于指定最小字段宽度 (以字节为单位) ,其中转换结果为右对齐 (如果指定了标志 - ,那么为左对齐)。 缺省值为0。
左精度
- #n
- 后跟十进制数字字符串 n 的 # ,指定期望在基数字符左侧格式化的最大位数。 此选项可用于使对
strfmon()的多个调用的格式化输出在同一列中保持一致。 它还可用于使用特殊字符 (如 $* **123.45) 填充未使用的位置。 此选项会导致格式化金额,就像它具有 n指定的位数一样。 如果需要超过 n 个数字位置,那么将忽略此转换规范。 用数字填充字符填充超过实际需要的数字位置 (请参阅上面的 = f 标志)。如果未使用 ^ 标志抑制分组,并且为当前语言环境定义了分组,那么将在添加填充字符 (如果有) 之前插入分组分隔符。 即使填充字符是数字,也不会将分组分隔符应用于填充字符。 为了确保对齐,在格式化输出中的数字之前或之后出现的任何字符 (例如货币或符号符号) 将根据需要使用空格字符进行填充,以使其正格式和负格式的长度相等。
右精度
- .p
- 后跟十进制数字字符串 p 的句点指定基数字符后的位数。 如果正确精度 p 的值为 0 ,那么不会显示基数字符。 如果未指定正确的精度,那么将使用当前语言环境指定的缺省值。 要格式化的金额在格式化前舍入为指定的位数。
转换字符
| 指定者 | 含义 |
|---|---|
| %i | 双参数根据语言环境的国际货币格式进行格式化。 |
| %n | 双精度参数根据语言环境的国家或地区货币格式进行格式化。 |
| %% | 替换为%。 未转换任何参数。 |
返回值
如果生成的字节总数 (包括结束空字符) 不超过 maxsize,那么 strfmon() 函数将返回放入 s指向的数组中的字节数,但不包括结束空字符。 否则,将返回零,并且未定义数组的内容。
errno 的值可以设置为:
- E2BIG
- 由于缓冲区中缺少空间,因此转换已停止。
示例
#include <stdio.h>
#include <monetary.h>
#include <locale.h>
int main(void)
{
char string[100];
double money = 1234.56;
if (setlocale(LC_ALL, "/qsys.lib/en_us.locale") == NULL) {
printf("Unable to setlocale().\n");
exit(1);
}
strfmon(string, 100, "%i", money); /* USD 1,234.56 */
printf("%s\n", string);
strfmon(string, 100, "%n", money); /* $1,234.56 */
printf("%s\n", string);
}
/************************************************************
The output should be similar to:
USD 1,234.56
$1,234.56
************************************************************/