● 関数リファレンス
FLOATEX型の数値を指定フォーマットで文字列に変換する
int __stdcall floatex_ldstr_ldtoa_f(PFLOATEX pval,char *pformat,int formatlength,char *presult,int bufsize);
引数
引数名 | 意味 |
pval | 変換対象の値を格納している FLOATEX型変数の先頭アドレス |
pformat | 変換フォーマットを格納している char 型配列の先頭アドレス |
formatlength | pformat が指す文字列の長さ(末尾ヌルを含まず) |
presult | 結果を格納する char型配列の先頭アドレス |
bufsize | presult に指定する領域のバイト数(末尾ヌル分を含む) |
戻り値
正常終了した場合は、変換した文字列全体の長さを返します。
エラーの場合は負の値を返します。
説明
FLOATEX型の数値を文字列に変換します。
この関数は snprintf に近い動作をします。
戻り値 = snprintf(presult , bufsize , pformat , *(long double *)pval );
戻り値には、presult の指す場所に格納された文字列の長さが返されます(末尾ヌルを含まず)。snprintf では、指定した最大格納文字数よりも長い文字列の場合は負の値を返しますが、この関数は、エラー以外では負の値を返しません。
負のゼロや無限大、NaN の文字列については floatex_ldstr_ldtoa と同じです。
フォーマットについて
pformat の指すフォーマット文字列は、snprintf と異なる点があります。
フォーマット.
[空白] % [書式] { Lf | Le | LE | Lg | LG } \0
フォーマットには、一つの数値変換フォーマットのみを記述します。
- 書式の部分は、snprintf(printf) と同じです。符号、0 や空白のパディング、幅、小数点、精度を指定します。
- 先頭側に空白がある場合は飛ばされます。この空白は文字列として出力されません。
- '%' は 1 つのみです。フォーマット文字列全体で、文字として 2 つ以上 '%' があるとエラーになります。
- 型指定には "Lf" 、"Le" 、"LE" 、"Lg" 、"LG" のいずれかが必要で、無い場合や、その他の文字がある場合はエラーになります。
- 型指定の後ろはヌル文字である必要があります。ヌルではない場合はエラーになります。
- formatlength には、pformat が指すフォーマット文字列の長さを正確に指定する必要があります。pformat [0] 〜 pformat [formatlength - 1] の範囲にヌル文字がある場合はエラーになります。
テスト.
#include <stdio.h>
#include "floatex.h"
int main(void)
{
FLOATEX val;
char buf[32];
int ret;
unsigned int oldcw;
oldcw = floatex_storecw();
floatex_loadcw(FEX_MCW_EM | FEX_PC_64 | FEX_RC_NEAR);
floatex_doubleto(123456789.12345,val);
/*
フォーマット文字列が文字列定数の場合は、以下のように sizeof を使用する
事ができます。ただし、sizeof が返す値は領域のサイズであり、文字列の長さ
ではないので注意してください(末尾ヌル分を差し引く必要がある)。
*/
#define FORMAT1 "%.19Lf"
ret = floatex_ldstr_ldtoa_f(
val,FORMAT1,sizeof(FORMAT1)-1,buf,sizeof(buf));
printf("%d %s\n",ret,buf);
#define FORMAT2 "%019.Lf"
ret = floatex_ldstr_ldtoa_f(
val,FORMAT2,sizeof(FORMAT2)-1,buf,sizeof(buf));
printf("%d %s\n",ret,buf);
#define FORMAT3 "% 19.Lf"
ret = floatex_ldstr_ldtoa_f(
val,FORMAT3,sizeof(FORMAT3)-1,buf,sizeof(buf));
printf("%d %s\n",ret,buf);
#define FORMAT4 "%+ 19.19Lf"
ret = floatex_ldstr_ldtoa_f(
val,FORMAT4,sizeof(FORMAT4)-1,buf,sizeof(buf));
printf("%d %s\n",ret,buf);
#define FORMAT5 "%+ 19.Le"
ret = floatex_ldstr_ldtoa_f(
val,FORMAT5,sizeof(FORMAT5)-1,buf,sizeof(buf));
printf("%d %s\n",ret,buf);
#define FORMAT6 "% 19.LG"
ret = floatex_ldstr_ldtoa_f(
val,FORMAT6,sizeof(FORMAT6)-1,buf,sizeof(buf));
printf("%d %s\n",ret,buf);
#define FORMAT7 "% .19LG"
ret = floatex_ldstr_ldtoa_f(
val,FORMAT7,sizeof(FORMAT7)-1,buf,sizeof(buf));
printf("%d %s\n",ret,buf);
floatex_ldstr_term();
floatex_loadcw(oldcw);
return 0;
}
結果.
29 123456789.1234499961000000000
19 0000000000123456789
19 123456789
30 +123456789.1234499961000000000
19 +1e+08
19 1E+08
21 123456789.1234499961