据我了解,以下声明:
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中的一个错误,还是我在这里遗漏了什么?
答案 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