![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: I have several reports written in C that use the setlocale() function to setup formated printing of numbers (99,999,999.99). The problem that I am having is that when a number is negative and is 3,6 or 9 digits in length is will print in the following fo rmat -,999.99 or -,999,999.00. Is there any way to prevent the comma from printing after the sign or to use a different locale. Compaq C version - v6.0-001 locale used - EN_US_ISO8859-1.LOCALE;1 The Answer is : This appears to be a bug within the printf family of functions, a bug which adversely effects formatting negative numbers by the %d and %i directives when locale-specific thousands' grouping character is requested (by specifying apostrophe flag character on the format directive). As the %f directive does not seem to be affected by the bug, the use %'f direcive instead of %'d or %'i would be the most obvious workaround, prior to the availability of a fix. The bug will be fixed in a future release of the Compaq C Run-Time Library on OpenVMS. Thank you for reporting this. $ cc/ver Compaq C V6.2-005 on OpenVMS Alpha V7.2-1H1 $ run x.exe %f directive: -999.99 %d directive: -,999 %i directive: -,999 %f directive: -999,999.99 %d directive: -,999,999 %i directive: -,999,999 %f directive: -999,999,999.99 %d directive: -,999,999,999 %i directive: -,999,999,999 x.c --- #include [stdio.h] #include [locale.h] main() if ( !setlocale(LC_ALL, "en_US.ISO8859-1") ) perror("setlocale"); /* three digits */ printf("%%f directive: %'.2f\n", -999.99); printf("%%d directive: %'d\n", -999); printf("%%i directive: %'i\n\n", -999); /* six digits */ printf("%%f directive: %'.2f\n", -999999.99); printf("%%d directive: %'d\n", -999999); printf("%%i directive: %'i\n\n", -999999); /* nine digits */ printf("%%f directive: %'.2f\n", -999999999.99); printf("%%d directive: %'d\n", -999999999); printf("%%i directive: %'i\n", -999999999);
|