strfmon ()- 將貨幣值轉換為字串

格式

#include <monetary.h>
int strfmon(char *s, size_t maxsize, const char *format, argument_list);

語言層次

XPG4

安全執行緒

區分語言環境

此函數的行為可能受到現行語言環境的 LC_CTYPE 及 LC_LAYMONER 種類的影響。 在編譯指令上指定 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. 轉換字元
指定元 (specifier) 意義
%i 雙引數會根據語言環境的國際貨幣格式來格式化。
%n Double 引數會根據語言環境的國家貨幣格式來格式化。
%% 由% 取代。 未轉換任何引數。

回覆值

如果產生的位元組總數 (包括結尾空值字元) 不超過 maxsize,則 strfmon() 函數會傳回在 s所指向的陣列中放置的位元組數,但排除結尾空值字元。 否則,會傳回零,且未定義陣列的內容。

錯誤碼的值可以設為:
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   
************************************************************/

相關資訊