附言:如何将整数转换为字符串?

18

在 PostScript 中,cvs 操作符 被称为将数字转换为字符串。我该如何使用它? 我尝试过:

100 100 moveto
3.14159 cvs show
或。
100 100 moveto
3.14159 cvs string show

但是它没有起作用。

有任何帮助吗?

2个回答

16

尝试3.14159 20 string cvs show

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

如果你需要进行多个字符串转换,最好创建一个字符串并在每次转换中重复使用它,这样更高效。

/s 20 string def
3.14159 s cvs show

我不确定这是否是GhostScript中的一个错误(语言规范不太清楚):似乎字符串没有被“cvs”终止,因此如果您有一个“5字符串”,并且先将其转换为“-10.0”,然后再转换为“0.0”,则该字符串将保留“0.0.0”(GPL Ghostscript 9.26)。 - U. Windl
请参见 https://dev59.com/RjsDtIcB2Jgan1znT10L。 - U. Windl

13

简言之;

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

 1.42857
(       ) cvs show

更多...

你甚至可以通过展示更大字符串的各个子字符串来进行格式化输出。

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

但是,Ghostscript风格指南禁止这样做。而且这几乎是我们唯一公开发布的Postscript风格指南。(在comp.lang.postscript中有关此问题的讨论。)因此,通常建议在需要时分配新的字符串,并让垃圾回收器来完成其工作。

4.28571 7 string cvs show

如果您将这个操作封装在一个过程中,那么新分配字符串可能非常重要。

/toString { (          ) cvs } def
%    vs
/toString { 10 string cvs } def

如果你分配了一个新的字符串,那么封闭的程序可以被视为其输入的 纯函数。如果你使用嵌入的文字字符串作为缓冲区,则生成的字符串是 与状态相关的,如果再次运行生成过程,则该字符串将失效。

不要这样做太多...

作为最后的手段,真正懒惰的黑客会劫持=string,这是内置的128字节缓冲区,用于输出数字(当然要使用我们的朋友)。这是解释器特定的,根据标准不可移植。

5.71428 =string cvs show

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

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

这种做法可以省去额外的微秒级时间,并且使交互式代码检查变得更加困难。在这个过程中调用 == 并不会暴露你正在使用 =string,它看起来就像任何其他的字符串。

以这种方式使用 =string 继承了上一节描述的所有“状态依赖性”问题,并因为只有一个 =string 缓冲区而加剧了这些问题。此外,它还增加了可移植性问题,因为 =string 是非标准的——尽管在历史上的 Adobe 实现和 Ghostscript 中可用——它是一个传统的 hack,应该仅在适当的情况下使用。


另外一些事情,没有人(在这里)提到...

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

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

两件事情:1)为什么所有这些都是必要的?2)一个初学者需要所有这些不同的技巧来使事情快上一微秒吗? - user242579
  1. 你说得对,这可能并不必要。
  2. 不,你再次说得对,初学者不需要这些东西。我应该编辑答案,并在第一个代码片段周围加上 tldr; 标题。那才是你真正需要的。其他的只是试图提供更深入的理解,并引用 GS 样式指南和 comp.lang.postscript 新闻组的存在。
- luser droog
@user242579编辑了答案。感谢您的评论! - luser droog
只是想指出,这里的额外深度有时确实非常有用 - 我正在寻找使用空格进行字符串右对齐,并从这里得到了正确的想法... - Klapaucius Klapaucius
只是想指出,这里的额外深度有时真的很有用 - 我正在寻找用空格将字符串右对齐,并在这里得到了正确的思路... - Klapaucius Klapaucius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接