数値の処理
数値の読み込み
ライブラリには、高性能な数値リーダーが組み込まれています。
既定では、次の規則で数値を読み込みます。
- 正の整数は
uint64_tとして読み込みます。オーバーフローした場合は、doubleに変換します。 - 負の整数は
int64_tとして読み込みます。オーバーフローした場合は、doubleに変換します。 - 浮動小数点数は、正しく丸めて
doubleとして読み込みます。 doubleの数値がオーバーフローして無限大になると、エラーを報告します。- 数値がJSONの標準に準拠していない場合は、エラーを報告します。
数値の解析方法は、次の3つのフラグで調整できます。
YYJSON_READ_ALLOW_INF_AND_NAN:nan/infの数値やリテラルをdoubleとして読み込みます(非標準)。YYJSON_READ_NUMBER_AS_RAW:数値をすべて解析せず、未加工の文字列として読み込みます。YYJSON_READ_BIGNUM_AS_RAW:大きな数値(オーバーフローまたは無限大)を解析せず、未加工の文字列として読み込みます。
詳細は「読み込みフラグ」の節を参照してください。
数値の書き出し
ライブラリには、高性能な数値ライターが組み込まれています。
既定では、次の規則で数値を書き出します。
- 正の整数は、符号なしで書き出します。
- 負の整数は、負号を付けて書き出します。
- 浮動小数点数は、次の変更を加えたECMAScript形式で書き出します。
- 数値が
InfinityまたはNaNの場合は、エラーを報告します。 - 入力情報を保持するため、
-0.0の負号を保持します。 - 指数部の正号は除去します。
- 数値が
- 浮動小数点数ライターは、正しく丸められた最短の10進表現を生成します。
数値の書き出し方法は、次のフラグで調整できます。
YYJSON_WRITE_ALLOW_INF_AND_NANは、inf/nanの数値を、エラーにせずInfinityおよびNaNリテラルとして書き出します(非標準)。YYJSON_WRITE_INF_AND_NAN_AS_NULLは、inf/nanの数値をnullリテラルとして書き出します。YYJSON_WRITE_FP_TO_FLOATは、実数をdoubleではなくfloatとして書き出します。YYJSON_WRITE_FP_TO_FIXED(prec)は、実数を固定小数点表記で書き出します。
詳細は「書き出しフラグ」の節を参照してください。
個々の値の出力形式を制御する補助関数もあります。
yyjson_set_fp_to_float(yyjson_val *val, bool flt)とyyjson_mut_set_fp_to_float(yyjson_mut_val *val, bool flt)は、この実数をfloatまたはdoubleの精度で書き出します。yyjson_set_fp_to_fixed(yyjson_val *val, int prec)とyyjson_mut_set_fp_to_fixed(yyjson_mut_val *val, int prec)は、この実数を固定小数点表記で書き出します。precは1から15の範囲である必要があります。
数値の変換関数
ライブラリ内部の数値変換処理に直接アクセスするためのユーティリティー関数も2つあります。 これらは単独で使うことを想定しており、通常はメモリを確保しません。
// parse a number from string
const char *yyjson_read_number(const char *dat,
yyjson_val *val,
yyjson_read_flag flg,
const yyjson_alc *alc,
yyjson_read_err *err);
// write a number to string
char *yyjson_write_number(const yyjson_val *val, char *buf);