summaryrefslogtreecommitdiffhomepage
path: root/src/numeric.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-05-26 11:17:47 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-05-26 17:29:18 +0900
commitc019d8d34d2db5de218802d923e6d0197a2ffca0 (patch)
treef0b18c2c7ab657f7f6bf4a324048d59cb41ecee7 /src/numeric.c
parent05cc3a8d9958c618aafc4b01548a85834f23dd6d (diff)
downloadmruby-c019d8d34d2db5de218802d923e6d0197a2ffca0.tar.gz
mruby-c019d8d34d2db5de218802d923e6d0197a2ffca0.zip
fmt_fp.c: move mruby specific `mrb_float_to_str` to `numeric.c`
Diffstat (limited to 'src/numeric.c')
-rw-r--r--src/numeric.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/numeric.c b/src/numeric.c
index 24160fb77..fe9995bd4 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -277,6 +277,30 @@ flo_div(mrb_state *mrb, mrb_value x)
return mrb_float_value(mrb, a);
}
+MRB_API mrb_value
+mrb_float_to_str(mrb_state *mrb, mrb_value flo)
+{
+ char buf[25];
+#ifdef MRB_USE_FLOAT32
+ const int prec = 7;
+#else
+ const int prec = 15;
+#endif
+
+ mrb_format_float(mrb_float(flo), buf, sizeof(buf), 'g', prec, '\0');
+ for (char *p = buf; *p; p++) {
+ if (*p == '.') goto exit;
+ if (*p == 'e') {
+ memmove(p+2, p, strlen(p)+1);
+ memcpy(p, ".0", 2);
+ goto exit;
+ }
+ }
+ strcat(buf, ".0");
+ exit:
+ return mrb_str_new_cstr(mrb, buf);
+}
+
/* 15.2.9.3.16(x) */
/*
* call-seq: