题
我理解它,以下声明:
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
.
似乎没有保留足够的空间。但是前面的例子是基本的错误,或者我在这里缺少一些东西吗?
解决方案
看起来像bug。当<0>和数千分的分隔符在一起时,它会增加零奖励零。 <0>应该计算1个位置。
它在基本的1.3(OpenVMS 8.3)下为我和OpenVMS 8.4的1.7-000再现。 我使用较小的测试值来避免使用“长整数的长度精度的10位数”的最大整数大小的混淆/交互。
btw ..良好使用“nnn”l。预先撤销任何(默示)转换讨论。 我会将逗号移动到###序列的结束或开始,以避免暗示特定位置。
作为(但是uggly)解决方法,您可以使用格式$(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
. 不隶属于 StackOverflow