打印使用中的HP Basic异常

时间:2014-02-25 13:05:01

标签: basic openvms vms

据我了解,以下声明:

print using "<0>#,##", 1234

输出:

1,234

这是有道理的;前导零(其中没有)和五个字符可用于我们要输出的五个字符。我理解的另一个陈述是:

print using "<0>#####,#######", "12345678"L

输出:

00,012,345,678

再次,因为我对格式化字符的理解是有意义的; 14个字符可用于数字,逗号和前导零。

我不明白的是:

print using "<0>####,#######", "12345678"L

可以输出:

00,012,345,678

当然这是一个太多的前导零?当然应该是:

0,012,345,678

我可以看到,有时会在指定的长度之上添加一个前导零,否则输出将以一个前导逗号开头,例如在这个例子中:

print using "<0>###,#######", "12345678"L

产生

0,012,345,678
尽管似乎没有留出足够的空间。但是前面的例子是Basic中的一个错误,还是我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:1)

看起来像bug。当&lt; 0&gt;时,它增加奖励前导零。和千位分隔符一起玩。 那个&lt; 0&gt;应该算上1个位置。

它在Basic 1.3(OpenVMS 8.3)下为我复制,在OpenVMS 8.4上为1.7-000复制。 我使用较小的测试值来避免与最大整数大小“LONG整数的十位精度”Basic Ref手册产生混淆/交互。

顺便说一句..好好利用“nnn”L。这优先于任何(隐含的)转换讨论。 我会将逗号移动到###序列的结尾或开头,以避免暗示特定的位置。

作为(但是 - uggly)解决方法,您可以使用FORMAT $(val,format-string)。 它有同样的问题,但程序会得到一个改变来调整结果。

$ cre tmp.bas
 1      OPTION TYPE = EXPLICIT, SIZE = INTEGER LONG, CONSTANT TYPE = INTEGER
        print using "<0>###,", 1234
        print using "<0>###,", 123
        print using "<0>###,", 12
        print using "<0>###", 1234
        print using "<0>###", 123
        print using "<0>###", 12
 Exit
$ bas tmp
$ link tmp
$ run tmp
1,234
00,123
00,012
1234
0123
0012