● 関数リファレンス

FLOATEX型の数値を指定フォーマットで文字列に変換する

    int __stdcall    floatex_ldstr_ldtoa_f(PFLOATEX pval,char *pformat,int formatlength,char *presult,int bufsize);

引数

引数名意味
pval変換対象の値を格納している FLOATEX型変数の先頭アドレス
pformat変換フォーマットを格納している char 型配列の先頭アドレス
formatlengthpformat が指す文字列の長さ(末尾ヌルを含まず)
presult結果を格納する char型配列の先頭アドレス
bufsizepresult に指定する領域のバイト数(末尾ヌル分を含む)

戻り値

正常終了した場合は、変換した文字列全体の長さを返します。
エラーの場合は負の値を返します。

説明

FLOATEX型の数値を文字列に変換します。

この関数は snprintf に近い動作をします。

    戻り値 = snprintf(presult , bufsize , pformat , *(long double *)pval );

戻り値には、presult の指す場所に格納された文字列の長さが返されます(末尾ヌルを含まず)。snprintf では、指定した最大格納文字数よりも長い文字列の場合は負の値を返しますが、この関数は、エラー以外では負の値を返しません。

負のゼロや無限大、NaN の文字列については floatex_ldstr_ldtoa と同じです。


フォーマットについて

pformat の指すフォーマット文字列は、snprintf と異なる点があります。

  フォーマット.

    [空白] % [書式] { Lf | Le | LE | Lg | LG } \0

フォーマットには、一つの数値変換フォーマットのみを記述します。


テスト.

#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