1

据我了解,以下声明:

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 中的错误,还是我在这里遗漏了什么?

4

1 回答 1

1

看起来像虫子。当 <0> 和千位分隔符一起播放时,它会添加一个奖金前导零。<0> 应计为 1 个位置。

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

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

作为一种(但很丑的)解决方法,您可以使用 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
于 2014-02-25T15:40:11.510 回答