duk_ret_t duk_bi_number_prototype_to_fixed(duk_context *ctx) { duk_small_int_t frac_digits; duk_double_t d; duk_small_int_t c; duk_small_uint_t n2s_flags; frac_digits = (duk_small_int_t) duk_to_int_check_range(ctx, 0, 0, 20); d = duk__push_this_number_plain(ctx); c = (duk_small_int_t) DUK_FPCLASSIFY(d); if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { goto use_to_string; } if (d >= 1.0e21 || d <= -1.0e21) { goto use_to_string; } n2s_flags = DUK_N2S_FLAG_FIXED_FORMAT | DUK_N2S_FLAG_FRACTION_DIGITS; duk_numconv_stringify(ctx, 10 /*radix*/, frac_digits /*digits*/, n2s_flags /*flags*/); return 1; use_to_string: DUK_ASSERT_TOP(ctx, 2); duk_to_string(ctx, -1); return 1; }
duk_ret_t duk_bi_number_prototype_to_exponential(duk_context *ctx) { duk_bool_t frac_undefined; duk_small_int_t frac_digits; duk_double_t d; duk_small_int_t c; duk_small_uint_t n2s_flags; d = duk__push_this_number_plain(ctx); frac_undefined = duk_is_undefined(ctx, 0); duk_to_int(ctx, 0); /* for side effects */ c = (duk_small_int_t) DUK_FPCLASSIFY(d); if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { goto use_to_string; } frac_digits = (duk_small_int_t) duk_to_int_check_range(ctx, 0, 0, 20); n2s_flags = DUK_N2S_FLAG_FORCE_EXP | (frac_undefined ? 0 : DUK_N2S_FLAG_FIXED_FORMAT); duk_numconv_stringify(ctx, 10 /*radix*/, frac_digits + 1 /*leading digit + fractions*/, n2s_flags /*flags*/); return 1; use_to_string: DUK_ASSERT_TOP(ctx, 2); duk_to_string(ctx, -1); return 1; }
duk_ret_t duk_bi_number_prototype_to_precision(duk_context *ctx) { /* The specification has quite awkward order of coercion and * checks for toPrecision(). The operations below are a bit * reordered, within constraints of observable side effects. */ duk_double_t d; duk_small_int_t prec; duk_small_int_t c; duk_small_uint_t n2s_flags; DUK_ASSERT_TOP(ctx, 1); d = duk__push_this_number_plain(ctx); if (duk_is_undefined(ctx, 0)) { goto use_to_string; } DUK_ASSERT_TOP(ctx, 2); duk_to_int(ctx, 0); /* for side effects */ c = (duk_small_int_t) DUK_FPCLASSIFY(d); if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { goto use_to_string; } prec = (duk_small_int_t) duk_to_int_check_range(ctx, 0, 1, 21); n2s_flags = DUK_N2S_FLAG_FIXED_FORMAT | DUK_N2S_FLAG_NO_ZERO_PAD; duk_numconv_stringify(ctx, 10 /*radix*/, prec /*digits*/, n2s_flags /*flags*/); return 1; use_to_string: /* Used when precision is undefined; also used for NaN (-> "NaN"), * and +/- infinity (-> "Infinity", "-Infinity"). */ DUK_ASSERT_TOP(ctx, 2); duk_to_string(ctx, -1); return 1; }
duk_ret_t duk_bi_number_prototype_to_string(duk_context *ctx) { duk_small_int_t radix; duk_small_uint_t n2s_flags; (void) duk__push_this_number_plain(ctx); if (duk_is_undefined(ctx, 0)) { radix = 10; } else { radix = (duk_small_int_t) duk_to_int_check_range(ctx, 0, 2, 36); } DUK_DDD(DUK_DDDPRINT("radix=%ld", (long) radix)); n2s_flags = 0; duk_numconv_stringify(ctx, radix /*radix*/, 0 /*digits*/, n2s_flags /*flags*/); return 1; }
int duk_builtin_number_prototype_to_string(duk_context *ctx) { int radix; int n2s_flags; (void) push_this_number_plain(ctx); if (duk_is_undefined(ctx, 0)) { radix = 10; } else { radix = duk_to_int_check_range(ctx, 0, 2, 36); } DUK_DDDPRINT("radix=%d", radix); n2s_flags = 0; duk_numconv_stringify(ctx, radix /*radix*/, 0 /*digits*/, n2s_flags /*flags*/); return 1; }