如何在ATS中将浮点数转换为字符串?

时间:2016-10-21 15:25:16

标签: ats

基本上,我正在寻找以下界面的功能:

fun double2string(x: double): string

将double转换为字符串表示形式。例如,double2string(3.14)应返回“3.14”。

4 个答案:

答案 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。您可以在线试用此示例:

https://glot.io/snippets/ejm6ous1fh

答案 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]