HP Anomalía Básica en Impresión usando
Pregunta
Como lo entiendo, la siguiente declaración:
print using "<0>#,##", 1234
Salidas:
1,234
lo que tiene sentido; Los ceros principales (de los cuales no hay) y cinco caracteres disponibles para los cinco caracteres que queremos enviar. Otra afirmación que entiendo es:
print using "<0>#####,#######", "12345678"L
qué salidas:
00,012,345,678
de nuevo, tiene sentido dado mi comprensión de los caracteres de formato; 14 caracteres disponibles para los dígitos, comas y los principales ceros.
Lo que no entiendo es cómo:
print using "<0>####,#######", "12345678"L
puede emitir:
00,012,345,678
¿Seguramente ese es uno de los ceros principales? Seguramente debería ser:
0,012,345,678
Puedo ver que a veces se agrega un cero inicial más allá de la longitud especificada, si de lo contrario, la salida comenzaría con una coma líder, como en este ejemplo:
print using "<0>###,#######", "12345678"L
que produce
0,012,345,678
a pesar de aparentemente no reservando suficiente espacio. Pero, ¿es el ejemplo anterior un error en básico, o estoy perdiendo algo aquí?
Solución
Parece un error.Agrega un bono que lleva cero cuando <0> y el separador de miles juegan juntos. Que <0> debe contar para 1 posición.
Se reproduce para mí en Basic 1.3 (OpenVMS 8.3) y 1.7-000 en OpenVMS 8.4. Utilicé valores de prueba más pequeños para evitar la creación de confusión / interacción con el tamaño máximo del entero de "Diez dígitos de precisión para los enteros largos" MANUAL BASIC REF.
BTW .. Buen uso de la "NNN" l.Que prevenga cualquier discusión de conversión (implícita). Movería la coma, hasta el final o el inicio de la secuencia ### para evitar implicar una posición específica.
Como una solución (pero-uggly), puede usar Format $ (Val, Format-String). Tiene el mismo problema, pero el programa obtendrá un cambio para ajustar el 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