Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Numeros con 2 decimales

Estas en el tema de Numeros con 2 decimales en el foro de C/C++ en Foros del Web. Saludos. Tengo en un arreglo: arreglo = { 12.2362, 5236.214, 1.365} Quiero formatear los valores a 2 decimales. Esos valores dentro del arreglo son que ...
  #1 (permalink)  
Antiguo 10/07/2006, 15:38
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 4 meses
Puntos: 1
Numeros con 2 decimales

Saludos.

Tengo en un arreglo:

arreglo = { 12.2362, 5236.214, 1.365}

Quiero formatear los valores a 2 decimales.

Esos valores dentro del arreglo son que ??

Intente mostrarlos simplemente asi:

sprintf(numero1,"%10.2f",arreglo2[0]);

Pero al compilar me da el error: warning: passing arg 1 of sprintf

Creia que era por el tipo de data de numero1, asi que lo declare:

char *numero1, pero no logro nada.

Como podría formatear el valor de los elementos del arreglo a solo 2 decimales y dejarlo guardado en una variable.

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #2 (permalink)  
Antiguo 10/07/2006, 21:08
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
si declaras tu variable:

char* numero1;

a donde crees que apunta?
sabes que dirección de memoria estas escribiendo?
cuanta memoria hay reservada para ese puntero?
no sabes?

Yo tampoco, es por eso que todo puntero antes de usarse tienen que tener una dirección valida, ya sea que le asignes la memoria de una variable existente o que reserves con malloc o new.

Mejor aun, cuando no sea totalmente necesario usar punteros mejor usa arrays.

si declaras a numero1 como un array te evitaras de problemas siempre y cuando no sobrepases el numero de índices.

char numero1[10]; //por ejemplo
  #3 (permalink)  
Antiguo 10/07/2006, 22:16
Geo
 
Fecha de Ingreso: marzo-2003
Ubicación: México
Mensajes: 44
Antigüedad: 21 años, 2 meses
Puntos: 2
Todas las funciones en que se copiara algo a una cadena, necesitan que dicha cadena ya tenga memoria reservada, no lo van a hacer por ti (cosa que podrías hacer tú creándote una versión de dicha función).

Así, declara numero así:

Código:
char numero[ 10 ];
o así:
Código:
char *numero;

// Pero hay que reservar memoria antes de usar numero
// como búfer de una función de cadenas
numero = (char *)calloc( 11, sizeof( char ) );
Después de eso, ya puedes llamar a sprintf.

Saludos,
JJ (Geo).
__________________
La imaginación es el límite
Visita mi página o la versión anterior.
  #4 (permalink)  
Antiguo 12/07/2006, 07:49
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 4 meses
Puntos: 1
Caramba, entendi parte de lo que me explicaron.

Ahora lo que modifique fue lo siguiente

como los valores que estan en el arreglo pueden ser 1.253 ó 8521457.52689 ó 6258741.11 termine por definir a numero1 asi:

char numero1[11]="";

luego:

sprintf(numero1,"%11.2f",atof(arreglo[i])); // El i es porque este dentro de un for para sacar todos los valores del arreglo.

Buen, yo creia que esos valores dentro del arreglo eran CHAR, pero cuando corro lo que les muestro me da error, indicando que el entero no puede aplicar.

Así que lo cambie a esto:

sprintf(numero1,"%11.2f",atof((char *) arreglo[i]));

Lo que entiendo es que los valores que estan dentro del arreglo son Int, entonces para poder usar el "11,2f" debería llevarlo a double usando el atof pero antes debo convertirlo a char para poder transformarlo.

Luego ese valor numero1 debo concatenarlo a un XML que estoy construyendo. así que hago esto:

strcat(XML_Fact,"<MONTO>");
strcat(XML_Fact, (char *) numero1);
strcat(XML_Fact,"</MONTO>\n");

Ahora lo único que me ocurre es que se imprime en el XML lo siguiente:

<MONTO> 122,52</MONTO>

Es decir, coloca delante del número tantos espacios en blanco le falten para completar los 11 caracteres, una vez más, es lo que entiendo yo. Como le quito esos espacios en blanco entre la etiqueta de MONTO??

Por favor si estoy cometiendo un grave error, disculpenme, estoy tratando de aprender esta cosa.
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #5 (permalink)  
Antiguo 12/07/2006, 09:29
Geo
 
Fecha de Ingreso: marzo-2003
Ubicación: México
Mensajes: 44
Antigüedad: 21 años, 2 meses
Puntos: 2
Jeje, no te entendí muy bien :P.

Lo primero, el arreglo inicial, ¿de qué tipo es? Lo que quieres hacer es, los valores de este arreglo redondearlos a 2 decimales y convertirlos a una cadena para poder enviarlos a un archivo de texto (XML).

Te repito, ¿de qué tipo es el arreglo inicial? (Pensé que era un arreglo de float, pero veo que no), de allí podemos partir :).

Saludos,
JJ (Geo).
__________________
La imaginación es el límite
Visita mi página o la versión anterior.
  #6 (permalink)  
Antiguo 12/07/2006, 09:59
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 4 meses
Puntos: 1
Perfecto.

El arreglo1 es Int. Es decir esta como:

int arreglo1[10];
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #7 (permalink)  
Antiguo 12/07/2006, 12:18
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Pro que modificas la forma de usar sprntf, en el primer mensaje tuyo estas usando bien esta funcion:

Intente mostrarlos simplemente asi:

sprintf(numero1,"%10.2f",arreglo2[0]);

y esta correcto.

el problema no es con arreglo2 sino con numero1, variable que tu declaras como un puntero.
cuando lo correto seria declararla como un array de char:

float arreglo[] = {...//numeros floats.};
char numero1[11] = "";

sprintf(numero1, "%10.2f", arreglo[0]);

esto es para convertir un solo indice del vector numero a cadena.

si quieres convertir los 3 o mas y guardarlos en cadenas tendrias que modificar tu declaracion de numero

char numero[3][11];
float arreglo[] = {//numeros float...};

for(int i = 0; i < 3; i++)
{
sprintf(numero[i], "%10.2f", arreglo[i]);
}

tambien puedes crear una cadena conteniendo todos los numeros del arreglo pero no es esto lo que quieres supongo.

Saludos.
  #8 (permalink)  
Antiguo 12/07/2006, 21:10
Geo
 
Fecha de Ingreso: marzo-2003
Ubicación: México
Mensajes: 44
Antigüedad: 21 años, 2 meses
Puntos: 2
Jeje, estamos igual, porque ¿cómo es que quieres ponerle dos decimales a números enteros? Detalla un poco mejor qué es lo que estás tratando de hacer :).

Saludos,
JJ (Geo).
__________________
La imaginación es el límite
Visita mi página o la versión anterior.
  #9 (permalink)  
Antiguo 13/07/2006, 03:23
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
se supone que el arreglo es de float o mas no de int. puedes verlo en el primer mensaje del hilo.

arreglo = { 12.2362, 5236.214, 1.365};

con esto esta indicando que tiene :
float arreglo[] = {12.2362, 5236214, 1.365};

por tano si esto es correcto, no tendria problemas alusar sprintf, de la forma en que lo esta haciendo.

sino es asi, pues le aclaramos de una vez,.

los numeros enteros estan dispuestos en memoria de froma muy diferente a como lo estan los float, por tanto hacer una lectura de un numero int como si fuese float te daria valores totalmente incorrectos, tal vez pueda aparecern en la cadena foramteada un valor con 2 decimales pero este valor no creao que sea el correcto.

si tus variables manejaran datos con punto decimal tienes 2 opciones usar float o double,
generalmente con los float son sufucientes, sobre todo si solo te interesan 2 decimales.

el formato de lectura en la funcion prints o sprintf, es para indicarle a la funcion el tipo que se esta escribiendo, y no seria correcto para usarlo como casting, por tanto si tu variable es int pues usa el formato para int, si tu variable es float usa el formato para float, etc.

en cuestion de decimales estas en lo correcto siempre y cuando tu variables sea float o double.

por el momento solo eso.

Saludos.

Última edición por Nivel7; 13/07/2006 a las 03:31
  #10 (permalink)  
Antiguo 13/07/2006, 07:55
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 4 meses
Puntos: 1
Demonios, tengo un arroz con mango en este código entonces, jejejejeje

A ver si logro acomodar eso.

Muchas Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:25.