Código de C/Visual C - Formatear double

Formatear doublegráfica de visualizaciones


C/Visual C

estrellaestrellaestrellaestrellaestrella(2)
Publicado el 04 de Septiembre del 2002 por tinchiqui@hotmail.com
5.904 visualizaciones desde el 04 de Septiembre del 2002. Una media de 14 por semana
Código en ANSI C que 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.

Versión 1
estrellaestrellaestrellaestrellaestrella(2)

Publicado el 04 de Septiembre del 2002gráfica de visualizaciones de la versión: Versión 1
5.905 visualizaciones desde el 04 de Septiembre del 2002. Una media de 14 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#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 ] ; /* Nmero 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)

Luis Hernández
17 de Abril del 2006
estrellaestrellaestrellaestrellaestrella
Está mal codificado, la función no retorna un char*:

#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);

}
Responder
Luis Hernández
17 de Abril del 2006
estrellaestrellaestrellaestrellaestrella
Además no hace lo que promete. No deberías enredarte tanto, simplemente puedes usar el sprintf:

void main()
{
char num1[500];
double num=3.141592654;

sprintf(num1, \"%04.4f\", num);
printf(\"num1:<%s>\\n\", num1);
}
Responder

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios

http://lwp-l.com/s303