基本上,我正在寻找以下界面的功能:
fun double2string(x: double): string
将double转换为字符串表示形式。例如,double2string(3.14)应返回“3.14”。
答案 0 :(得分:1)
有时我会选择以下作弊:
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
%{^
#include <assert.h>
char *double2string(double x) {
#define DECIMAL 8
#define DECIMAL_FORMAT "%.8e"
#define DECIMAL_LEN DECIMAL+2+5
char *s = malloc(DECIMAL_LEN+1);
assert(NULL != s);
memset(s, 0, DECIMAL_LEN+1);
snprintf(s, DECIMAL_LEN, DECIMAL_FORMAT, x);
return s;
}
%}
extern fun double2string (x: double): strptr = "mac#"
implement main0 () = {
val s = double2string 1234567890.1234567890
val () = println! s
val () = free s
}
答案 1 :(得分:0)
ATSLIB中有一个名为atspre_string_make_snprintf
的函数用于构造字符串。例如,人们可以这样做:
#include
"share/atspre_staload.hats"
fun
double2string(x: double): string =
$extfcall
(
string, "atspre_string_make_snprintf", "%.8e", x
) (* double2string *)
implement
main0() =
println! ("Pi = ", double2string(3.1415926535))
atspre_string_make_snprintf返回的是一个线性字符串(strptr),可以释放:
fun double2strptr(x: double): Strptr1 = $extfcall(...)
编译时,请记得传递标志-latslib。您可以在线试用此示例:
答案 2 :(得分:0)
为了编译JavaScript,&#39; String&#39;可以这样称呼。实际上,&#39; String&#39;将任何给定的对象转换为某种形式的字符串表示形式。
答案 3 :(得分:0)
这是一种快速的方法:
fun
double2string
(
x0: double
) : string = let
val i0 = g0float2int_double_int(x0)
val d0 = g0float2int_double_int(100000000 * (x0 - i0))
val i0_rep = g0int2string(i0)
val d0_rep = g0int2string(d0)
val x0_rep =
string0_append3
($UNSAFE.strptr2string(i0_rep), ".", $UNSAFE.strptr2string(d0_rep))
// end of [val]
val ((*freed*)) = strptr_free(i0_rep)
val ((*freed*)) = strptr_free(d0_rep)
in
strptr2string(x0_rep)
end // end of [double2string]