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 个有效数字。

伪指令由% 字符,可选转换规范和用于确定伪指令行为的结束字符组成。

伪指令由以下序列组成:

  • % 字符。
  • 可选标志。
  • 可选字段宽度。
  • 可选的左精度。
  • 可选的右精度。
  • 指示要执行的转换类型的必需转换字符。

标志

表 1. 标志
标志 含义
= f = 后跟用作数字填充字符的单个字符 f 。 缺省情况下,数字填充字符是空格字符。 此标志不影响始终使用空格字符的字段宽度填充。 除非指定了左精度,否则将忽略此标志。
^ 格式化货币值时,请勿使用分组字符。 缺省值是插入当前语言环境中定义的分组字符。
+ 或 ( 指定表示正货币金额和负货币金额的样式。 如果指定了 + ,那么将使用语言环境的货币数量的 + 和-等值。 如果指定了 ( ) ,那么会将负数括在括号内。 缺省值为 +
! 不输出货币符号。 缺省值是输出货币符号。
- 对双参数使用左对齐。 缺省值是正确的理由。

字段宽度

w
十进制数字字符串 w ,用于指定最小字段宽度 (以字节为单位) ,其中转换结果为右对齐 (如果指定了标志 - ,那么为左对齐)。 缺省值为0。

左精度

#n
后跟十进制数字字符串 n 的 # ,指定期望在基数字符左侧格式化的最大位数。 此选项可用于使对 strfmon() 的多个调用的格式化输出在同一列中保持一致。 它还可用于使用特殊字符 (如 $* **123.45) 填充未使用的位置。 此选项会导致格式化金额,就像它具有 n指定的位数一样。 如果需要超过 n 个数字位置,那么将忽略此转换规范。 用数字填充字符填充超过实际需要的数字位置 (请参阅上面的 = f 标志)。

如果未使用 ^ 标志抑制分组,并且为当前语言环境定义了分组,那么将在添加填充字符 (如果有) 之前插入分组分隔符。 即使填充字符是数字,也不会将分组分隔符应用于填充字符。 为了确保对齐,在格式化输出中的数字之前或之后出现的任何字符 (例如货币或符号符号) 将根据需要使用空格字符进行填充,以使其正格式和负格式的长度相等。

右精度

.p
后跟十进制数字字符串 p 的句点指定基数字符后的位数。 如果正确精度 p 的值为 0 ,那么不会显示基数字符。 如果未指定正确的精度,那么将使用当前语言环境指定的缺省值。 要格式化的金额在格式化前舍入为指定的位数。

转换字符

表 2。 转换字符
指定者 含义
%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   
************************************************************/

相关信息