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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top