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 個有效位數。
指引由% 字元、選用轉換規格及決定指引行為的結束字元組成。
指引由下列順序組成:
- % 字元。
- 選用旗標。
- 選用欄位寬度。
- 選用的左精準度。
- 選用的右精準度。
- 必要的轉換字元,指出要執行的轉換類型。
旗標
| 旗標 | 意義 |
|---|---|
| = f | = 後接單一字元 f ,用作數值填入字元。 依預設,數值填入字元是空格字元。 此旗標不會影響一律使用空格字元的欄位寬度填入。 除非指定左精準度,否則會忽略此旗標。 |
| ^ | 格式化貨幣值時不要使用分組字元。 預設值是插入現行語言環境中定義的分組字元。 |
| + 或 ( | 指定代表正數及負數貨幣金額的樣式。 如果指定 + ,將使用語言環境的同等貨幣數量 + 和-。 如果指定 ( ,則負數金額會以括弧括住。 預設值為 +。 |
| ! | 不輸出貨幣符號。 預設值是輸出貨幣符號。 |
| - | 對雙引數使用左對齊。 預設值是正確的調整。 |
欄位寬度
- w
- 十進位數字串 w ,指定最小欄位寬度 (以位元組為單位) ,其中轉換的結果為向右對齊 (如果指定旗標 - ,則為向左對齊)。 預設值為0。
左精準度
- #n
- # 後接十進位數字串 n ,指定預期基數字元左側要格式化的位數上限。 此選項可用來將
strfmon()的多個呼叫的格式化輸出保持在相同直欄中對齊。 它也可以用來以特殊字元填入未用的位置,如 $***123.45。 這個選項會將數量格式化,如同它具有 n指定的位數一樣。 如果需要超過 n 個位數位置,則會忽略此轉換規格。 超過實際需要的數字位置會填入數字填入字元 (請參閱上方的 = f 旗標)。如果尚未使用 ^ 旗標抑制分組,且已針對現行語言環境定義分組,則會在新增填入字元 (如果有的話) 之前插入分組分隔字元。 即使填入字元是數字,也不會將分組分隔字元套用至填入字元。 為了確保對齊,在格式化輸出中出現在數字之前或之後的任何字元 (例如貨幣或符號) 會依需要以空格字元填補,使其正格式和負格式的長度相等。
右側精準度
- .p
- 句點後跟十進位數字串 p 會指定基數字元之後的位數。 如果右精準度 p 的值為 0 ,則不會出現基數字元。 如果未指定正確的精準度,則會使用現行語言環境指定的預設值。 格式化的數量會在格式化之前四捨五入至指定的位數。
轉換字元
| 指定元 (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
************************************************************/