This is a method allows you to print numbers with the format you specify in Control Panel - International Settings - Numbers.
#include <locale.h>
...
...
...
setlocale(LC_ALL, ".OCP");
CString Number2String(long double nNumber, int nDecimals)
{
CString sBuffer, sFormat, sRet;
NUMBERFMT nf;
int nRet, nDecimalPos, MAX_CHARS = 128;
char sDest[128], sDummy[16], sDecSep[16], sThowSep[16];
nf.NumDigits = nDecimals;
GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_ILZERO, sDummy, 16 );
nf.LeadingZero = atoi(sDummy);
GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SGROUPING, sDummy, 16 );
nf.Grouping = atoi(sDummy);
GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL, sDecSep, 16 );
nf.lpDecimalSep = sDecSep;
GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_STHOUSAND, sThowSep, 16 );
nf.lpThousandSep = sThowSep;
GetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_INEGNUMBER, sDummy, 16 );
nf.NegativeOrder = atoi(sDummy);
sFormat.Format("%%.%df", nDecimals );
sBuffer.Format( sFormat, nNumber);
// sBuffer must contain the number in standard (English) format
nDecimalPos = sBuffer.Find( localeconv()->decimal_point );
if( nDecimalPos != -1 )
sBuffer.SetAt(nDecimalPos, '.' );
// ready to convert...
nRet = GetNumberFormat(LOCALE_SYSTEM_DEFAULT, 0, sBuffer, &nf, sDest, MAX_CHARS);
if( nRet )
sRet = sDest;
else
sRet = "";
return sRet;
}