#include <stdio.h>
#include <ctype.h>
/*
*******************************************************************************
* FUNCIÓN: char * flszFormatearDoble( char *, double, int, int )
*
* Descripción:
* Deja en la cadena recibida en el primer parámetro el número
* recibido en el segundo, con formato ZZZ.ZZZ.ZZZ.ZZZ,ZZZZZ. El
* número total de caracteres de la cadena lo da el tercer
* parámetro, y el número de decimales lo da el último parámetro.
*
* Parámetros:
* char * .- Cadena donde dejar el resultado. Se supone que dicha
* cadena es lo bastante grande para contener el número
* formateado
* double .- Número a formatear
* int .- Número total de caracteres que tendrá el número
* int .- Posiciones decimales que se darán en el formateo. El
* punto decimal no se incluye en este parámetro, pero
* tambien se restará del número total de caracteres
* que tendrá el número formateado.
*
* Retorno:
* Puntero a la cadena donde se deja el resultado
*
*******************************************************************************
*/
char * flszFormatearDoble( char * pszDestino, double dOrigen, int iNumDig , int iPosDeci)
{
char szBufferOri [ 200 + 1 ] ; /* Número original convertido en cadena */
char szBufferDes [ 200 + 1 ] ; /* Destino del número formateado */
char szFormato [ 20 + 1 ] ; /* Formato para la conversión del original*/
int iOri = 0 ; /* Índice del buffer original */
int iDes = 0 ; /* Índice del buffer destino */
/*___Convertir el número original en una cadena___*/
sprintf( szFormato, "%%%-1d.%1dlf", iNumDig, iPosDeci ) ;
sprintf( szBufferOri, szFormato, dOrigen );
memset( szBufferDes, 0, sizeof( szBufferDes ) );
/*___Bucle para tratar el buffer con el número sin formatear___*/
for ( iOri = 0, iDes = 0;
iOri < iNumDig && iDes < sizeof( szBufferDes ) - 1;
iOri++)
{
if ( szBufferOri[ iOri ] == '.' ) /*_Convertir el punto en coma_*/
{
szBufferDes[ iDes++ ] = ',';
}
else
{
szBufferDes[ iDes++ ] = szBufferOri[ iOri ];
/*___Añadir el punto cuando sean miles___*/
if ( isdigit( szBufferOri[ iOri ] ) && ((iNumDig - iOri - (iPosDeci + (!iPosDeci ? 0 : 1))) % 3) == 1 && (iNumDig - iOri - iPosDeci) > 2)
{
szBufferDes[ iDes++ ] = '.';
}
}
} /*_Final del FOR_*/
return( strcpy( pszDestino, szBufferDes + ( iDes - iOri ) ) );
}
Comentarios sobre la versión: Versión 1 (2)
#include <stdio.h>
#include <ctype.h>
/*
*******************************************************************************
* FUNCIÓN: char * flszFormatearDoble( char *, double, int, int )
*
* Descripción:
* Deja en la cadena recibida en el primer parámetro el número
* recibido en el segundo, con formato ZZZ.ZZZ.ZZZ.ZZZ,ZZZZZ. El
* número total de caracteres de la cadena lo da el tercer
* parámetro, y el número de decimales lo da el último parámetro.
*
* Parámetros:
* char * .- Cadena donde dejar el resultado. Se supone que dicha
* cadena es lo bastante grande para contener el número
* formateado
* double .- Número a formatear
* int .- Número total de caracteres que tendrá el número
* int .- Posiciones decimales que se darán en el formateo. El
* punto decimal no se incluye en este parámetro, pero
* tambien se restará del número total de caracteres
* que tendrá el número formateado.
*
* Retorno:
* Puntero a la cadena donde se deja el resultado
*
*******************************************************************************
*/
void flszFormatearDoble( char pszDestino[], double dOrigen, int iNumDig , int iPosDeci)
{
char szBufferOri [ 200 + 1 ] ; /* Número original convertido en cadena */
char szBufferDes [ 200 + 1 ] ;/* Destino del número formateado */
char szFormato [ 20 + 1 ] ; /* Formato para la conversión del original*/
int iOri = 0 ; /* Índice del buffer original */
int iDes = 0 ; /* Índice del buffer destino */
/*___Convertir el número original en una cadena___*/
sprintf( szFormato, "%%%-1d.%1dlf", iNumDig, iPosDeci ) ;
sprintf( szBufferOri, szFormato, dOrigen );
/*memset( szBufferDes, 0, sizeof( szBufferDes ) );*/
printf("1\n");
/*___Bucle para tratar el buffer con el número sin formatear___*/
for ( iOri = 0, iDes = 0;
iOri < iNumDig && iDes < sizeof( szBufferDes ) - 1;
iOri++)
{
if ( szBufferOri[ iOri ] == '.' ) /*_Convertir el punto en coma_*/
{
szBufferDes[ iDes++ ] = ',';
}
else
{
szBufferDes[ iDes++ ] = szBufferOri[ iOri ];
/*___Añadir el punto cuando sean miles___*/
if ( isdigit( szBufferOri[ iOri ] ) && ((iNumDig - iOri - (iPosDeci + (!iPosDeci ? 0 : 1))) % 3) == 1 && (iNumDig - iOri - iPosDeci) > 2)
{
szBufferDes[ iDes++ ] = '.';
}
}
} /*_Final del FOR_*/
printf("2\n");
/*sprintf(pszDestino, "%s", szBufferDes[0] + ( iDes - iOri ) );*/
strcpy(pszDestino, szBufferDes + ( iDes - iOri ) );
printf("3\n");
printf("<%s>\n",pszDestino);
printf("4\n");
}
void main()
{
char num2[500];
double num=3.141592654;
flszFormatearDoble(num2, num, 4,4);
printf("num2:<%s>\n", num2);
}
void main()
{
char num1[500];
double num=3.141592654;
sprintf(num1, \"%04.4f\", num);
printf(\"num1:<%s>\\n\", num1);
}