如何限制 metapost 中逗号后的数字数量?

如何限制 metapost 中逗号后的数字数量?

我想限制标签内的浮点数:

beginfig(1)
   for i=1 upto 5:
      label.bot(textext("$" & (decimal (-0.8*i)) & "$"), (-0.8*i, -0.2));
endfig;
end;

目前它在逗号后显示 5 个数字。我需要 2 个。

答案1

您可以定义一个 MetaPost 宏来选择正确的子字符串:

vardef tdecimal(expr num, d) :=
  save numS; string numS; numS = decimal(num);
  save j; j := length numS;
  for k = 0 upto length numS - 1:
    if "." == substring (k,k+1) of numS: j:=k; fi
  endfor
  for k = j + 1 upto j + d:
    if "0" <> substring (k,k+1) of numS: j:=k+1; fi
  endfor
  substring (0,j) of numS
enddef;

然后您可以使用例如tdecimal(1.234567, 2)来获取1.23tdecimal(1.234567, 3)来获取1.234

更简单的替代方案是分别获取整数和小数部分的字符串表示,但这会导致 MetaPost 中的一些舍入问题。无论如何,如果你想尝试一下,代码将是

vardef twodecimal(expr num) :=
  if num < 0:
    "-" & decimal(floor(-num)) & "." & substring (1,3) of decimal(floor((-num-floor(-num)+1)*100))
  else:
    decimal(floor(num)) & "." & substring (1,3) of decimal(floor((num-floor(num)+1)*100))
  fi
enddef;

答案2

添加\usepackage{xintfrac}到序言(序言?我不记得元帖子术语了)并使用

label.bot(textext("$\xintRound{2}{" & (decimal (-0.8*i)) & "}$"), (-0.8*i, -0.2))

好吧,我完成了你的工作,并打开了 MetaPost 手册。我不知道你的“textext”是什么,它一定是由一些额外的宏提供的。

input TEX;

TEXPRE("\input xintfrac.sty\relax");

beginfig(1);
pickup pencircle scaled 1pt;
draw (0,0);
numeric i;
i := 1.236;
label.bot(TEX("$\xintTrunc{2}{" & (decimal (-0.8*i)) & "}$"), (-0.8*i, -0.2))
endfig;

end

当按照操作mpost生成正确的 EPS 文件时。我使用了\xintTrunc您想要的截断。这可以在没有任何包的情况下完成(截断比舍入更容易。)

我搜索了 MetaPost 手册中所有出现的“十进制”,但没有看到如何预先进行截断,但这一定是可能的,因为在参考文献中我看到“decNumber ANSI C 实现的一般十进制算术”。

答案3

这是“tdecimal”的另一个版本。欢迎任何改进。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

vardef tdecimal(expr num, d) :=
   save numS, k, j, jj, ep_, dp_ ;
   numeric k, j, jj, ip_, dp_ ;
   string numS ;
   numS = decimal(num) ;

   if (d <= 0) :
      decimal(round(num))
   else :
      if (d <= 14) :
         if (num >= 0) :
            j := 1 ;
         else :
            j := -1 ;
         fi ;
         ip_ := abs(floor(num)) ;
         dp_ := round((abs(num) - ip_)*(10**d))/((10**d)-0.1) ;   % -0.1 : Pb d'arrondi de MP
         numS := decimal(j*(ip_ + dp_)) ;
      fi ;
%     Position of '.'
      j := -1 ;
      jj := length(numS) ;
      k := 0 ;
      forever: exitunless (k <= jj - 1) ;
         if "." = substring (k, k+1) of numS :
            j := k ;   % position of '.'
            k := jj ;  % to exit loop
         fi ;
         k := k + 1 ;
      endfor
      if j < 0 :
         numS := numS & "." ;
         j := jj ;
      fi ;
      for k = j + 1 upto j + d :
         if (substring (k, k+1) of numS) = "" :
            numS := numS & "0" ;
         fi ;
      endfor ;
      substring (0, j+d+1) of numS
   fi
enddef ;


%show tdecimal(3.141592, 4) ;
%show tdecimal(-3.141592, 4) ;

相关内容