Anomalia básica da HP em impressão usando
Pergunta
Pelo que entendi, a seguinte afirmação:
print using "<0>#,##", 1234
saídas:
1,234
o que faz sentido;zeros à esquerda (dos quais não há nenhum) e cinco caracteres disponíveis para os cinco caracteres que queremos gerar.Outra afirmação que entendo é:
print using "<0>#####,#######", "12345678"L
quais saídas:
00,012,345,678
novamente, faz sentido, dada a minha compreensão dos caracteres de formatação;14 caracteres disponíveis para dígitos, vírgulas e zeros à esquerda.
O que não entendo é como:
print using "<0>####,#######", "12345678"L
pode produzir:
00,012,345,678
Certamente são muitos zeros à esquerda?Certamente deveria ser:
0,012,345,678
Posso ver que às vezes um zero à esquerda é adicionado acima do comprimento especificado, caso contrário a saída começaria com uma vírgula à esquerda, como neste exemplo:
print using "<0>###,#######", "12345678"L
que produz
0,012,345,678
apesar de aparentemente não reservar espaço suficiente.Mas o exemplo anterior é um bug no Basic ou estou faltando alguma coisa aqui?
Solução
Parece um bug.Ele adiciona um bônus à esquerda quando <0> e o separador de milhares tocam juntos.Esse <0> deve contar para 1 posição.
Ele se reproduz para mim no Basic 1.3 (OpenVMS 8.3) e 1.7-000 no OpenVMS 8.4.Usei valores de teste menores para evitar a criação de confusão/interação com o tamanho inteiro máximo do manual de referência básica "Dez dígitos de precisão para números inteiros LONG".
Por falar nisso..bom uso do "nnn"L.Isso impede qualquer discussão de conversão (implícita).Eu moveria a vírgula para o final ou início da sequência ### para evitar implicar uma posição específica.
Como solução alternativa (mas feia), você pode usar FORMAT$ ( val, format-string ).Tem o mesmo problema, mas o programa fará uma alteração para ajustar o resultado.
$ 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