后记:如何将整数转换为字符串?

时间:2011-09-25 19:49:18

标签: string numbers postscript

在postscript中, cvs * 运算符 *被称为将数字转换为字符串。我该怎么用? 我试过了:

100 100 moveto
3.14159 cvs show

100 100 moveto
3.14159 cvs string show

但它不起作用。

任何帮助?

2 个答案:

答案 0 :(得分:13)

尝试3.14159 20 string cvs show

string需要大小并将创建的字符串保留在堆栈中。 cvs需要一个值和一个字符串来存储转换后的值。

如果您正在进行大量的字符串转换,那么创建一个字符串并在每次转换中重复使用它可能更有效:

/s 20 string def
3.14159 s cvs show

答案 1 :(得分:12)

常见的习语是使用文字字符串作为模板。

1.42857 (       ) cvs show

您甚至可以通过向cvs提供更大字符串的各种子字符串来进行格式化输出。

%0123456.......
(2/7 =         ) dup 6 7 getinterval
2.85714 exch cvs pop show

但是Ghostscript Style Guide禁止这个。它几乎是我们发布的唯一已发布的Postscript风格指南。 (A discussion about this在comp.lang.postscript中。)因此,一个常见的建议是在需要时分配一个新的字符串,让垃圾收集器获得保留。

4.28571 7 string cvs show

作为最后的手段,真正懒惰的黑客会劫持=string===使用的内置128字节缓冲区输出数字(当然,使用我们的朋友cvs)。

5.71428 =string cvs show

如果你喜欢那个,你可以将它与=的其他技巧结合起来:立即评估名称。

{ 7.14285 //=string cvs show }   % embed =string in this procedure

这样可以减少额外的微秒,并使交互式检查代码变得更加困难。在此过程中调用==将不会显示您使用=string的事实;它看起来就像任何其他字符串一样。


来自a post by Helge Blischke in comp.lang.postscript的行李箱的另一招。这是获得零填充整数的简单方法。

/bindec         % <integer> bindec <string_of_length_6>
{
        1000000 add 7 string cvs 1 6 getinterval
}bind def