Código de C/Visual C - Formatear double

sin imagen de perfil

Formatear doublegráfica de visualizaciones


C/Visual C

Publicado el 4 de Septiembre del 2002 por Tinchiqui@hotmail.com (3 códigos)
6.341 visualizaciones desde el 4 de Septiembre del 2002
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 4 de Septiembre del 2002gráfica de visualizaciones de la versión: Versión 1
6.342 visualizaciones desde el 4 de Septiembre del 2002
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 ] ; /* 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)

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
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...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s303