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

Postscript: how to convert a integer to string?

在 postscript 中,据说 cvs *operator* 将数字转换为字符串。我应该如何使用它?
我试过了:

1
2
100 100 moveto
3.14159 cvs show

1
2
100 100 moveto
3.14159 cvs string show

但它没有用。

有什么帮助吗?


一个常见的习惯用法是使用文字字符串作为模板。

1
1.42857 (       ) cvs show

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

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

但 Ghostscript 风格指南禁止这样做。它几乎是我们唯一发布的 Postscript 样式指南。 (comp.lang.postscript 中对此进行了讨论。)因此,一个常见的建议是在需要时分配一个新字符串,并让垃圾收集器获得它的保留。

1
4.28571 7 string cvs show

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

1
5.71428 =string cvs show

如果你喜欢那个,你可以将它与 = 的另一个技巧结合使用:立即评估名称。

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

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

另一个包的技巧,来自 Helge Blischke 在 comp.lang.postscript 中的一篇文章。这是获取零填充整数的简单方法。

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

试试 3.14159 20 string cvs show.

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

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

1
2
/s 20 string def
3.14159 s cvs show