Foros del Web » Programación para mayores de 30 ;) » Programación General »

Float con comas

Estas en el tema de Float con comas en el foro de Programación General en Foros del Web. Mi principal problema es que tengo en una base de datos un campo decimal que está separado por comas. Yo programo con c++ y entonces ...
  #1 (permalink)  
Antiguo 19/08/2003, 04:04
 
Fecha de Ingreso: agosto-2003
Ubicación: Madrid
Mensajes: 8
Antigüedad: 21 años, 3 meses
Puntos: 0
Float con comas

Mi principal problema es que tengo en una base de datos un campo decimal que está separado por comas. Yo programo con c++ y entonces al declarar un float no puede recoger los decimales o da error.

Necesito saber como podría corregir esa conexión o simplemente si existe alguna variable tipo float pero con separadores siendo comas.

Gracias.
  #2 (permalink)  
Antiguo 19/08/2003, 05:00
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 21 años, 4 meses
Puntos: 1
Hola,

Bueno, antos que nada, quisiera preguntarte ciertas cosas, ya que no estoy seguro de haber entendido completamente bien tu requerimiento.

* Cuando hablas del campo de tu base de datos, ¿qué es lo que está separado por comas? Supongo que te refieres a que el separador decimal de cada número es una coma, pero podría ser que te estés refiriendo a la separación de varios registros de la base de datos, no sé...

* Al usar un valor float para contener el valor, ¿cómo estás haciendo esa recolección del dato, de la que hablas? ¿Oué tipo de expresiones o sentencias tienes en el código?

* ¿Tienes algún problema con la conexión a la base de datos? Digo, por que mencionas lo de "corregir esa conexión.."

* Adicionalmente, ¿sobre qué sistema operativo trabajas y qué compilador de C++ usas?


Bueno, te voy a presentar un ejemplo que quizás pueda servirte, asumiendo que:

a) Te refieres a almacenar en una variable tipo `float' el contenido de un valor numérico decimal que está disponible inicialmente como una cadena, en donde el separador decimal es la coma. Por ejemplo: 3,1416 (en contraste con 3.1416).

b) La forma como capturas la información en la variable, es mediante una función del tipo sscanf().


Código:
#include <locale.h>
#include <iostream.h>
#include <stdio.h>


#define LOCALE_PROPIO  "es_ES"  /* Localidad que usara este programa */


int
main (void)
{
    const char cadena[] = "3,1416";
    float valor;

    sscanf (cadena, "%f", &valor);
    cout<<"El valor tomado de la cadena "<<cadena<<" es "<<valor<<"\n";

    setlocale (LC_NUMERIC, LOCALE_PROPIO);

    cout<<"\nSe ha establecido la localidad numerica actual como "<<
        LOCALE_PROPIO<<"\n\n";

    sscanf (cadena, "%f", &valor);
    cout<<"El valor tomado de la cadena "<<cadena<<" es "<<valor<<"\n";

    return 0;
}

Este programa se vale de la localidad (aquello que en Inglés se conoce como locale) actual del entorno para mostrar el resultado de capturar en un valor `float' el contenido de la cadena "3,1416".

En el ejemplo, se le asigna a la categoría de localidad LC_NUMERIC el valor "es_ES", código que hace referencia al entorno de configuración de un usuario iberoamericano, en cuyo caso se asume que, por ejemplo, se desea manipular valores numéricos reales usando comas como separadores decimales.

Cabe anotar que este ejemplo en particular lo he probado en mi equipo, en un entorno Unix, con el compilador g++. Claro está, es necesario que el entorno esté configurado correctamente, en el sentido en que la localidad es_ES debe ser reconocida por el sistema. Puede que necesite de algunos retoques si desea usarse en otro tipo de sistema o con otro compilador. Esta es la salida que produce en mi máquina:

Código:
$ g++ -W -Wall -o numerico numerico.cpp
$ ./numerico
El valor tomado de la cadena 3,1416 es 3
 
Se ha establecido la localidad numerica actual como es_ES
 
El valor tomado de la cadena 3,1416 es 3,1416
Un cordial saludo
  #3 (permalink)  
Antiguo 19/08/2003, 08:01
 
Fecha de Ingreso: agosto-2003
Ubicación: Madrid
Mensajes: 8
Antigüedad: 21 años, 3 meses
Puntos: 0
Los datos que faltan

Como bien has dicho el separador decimal es la coma. Tu ejemplo me es muy valioso, pero no termina de explicarme ciertas cosas (aunque te lo agradezco enormemente, de verdad). Yo programo en C++ (MFC). La conexión a la base de datos es completamente correcta, funciona perfectamente. Yo hago una llamada SQL y en variables guardo los datos de los campos que me interesen, por ejemplo : "Nota media", que contiene un dato por ejemplo "6,8", mientras que C++ no puede procesar eso, necesitando un "6.8". Uso Windows XP y Visual C++ 7.0 (.NET).

MUCHÍSIMAS GRACIAS DE VERDAD.
  #4 (permalink)  
Antiguo 19/08/2003, 08:47
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 21 años, 4 meses
Puntos: 1
Bueno, desconozco el entorno sobre el que trabajas, pero podemos reconsiderar el problema y quizás enfocarlo de forma distinta.

¿De qué tipo de datos es la variable en donde almacenas el valor del campo "Nota media", por ejemplo? ¿Es una matriz de caracteres? ¿Y de allí quieres pasar el valor a un `float'?

Una solución en tal tipo de situación podría ser modificar la matriz de caracteres original, reemplazado las ocurrencias de comas por puntos, y luego leer el valor flotante desde la cadena de caracteres modificada. Consideremos este segundo ejemplo:

Código:
#include <iostream.h>
#include <stdio.h>
#include <string.h>


int
main (void)
{
    // Empezemos por reemplazar las comas por puntos en nuestra cadena

    char cadena[] = "3,1416";
    size_t longitud = strlen (cadena);

    for (int i = 0; i < (int) longitud; i++)
        if (cadena[i] == ',')
            cadena[i] = '.';


    // Ahora pasamos a leer un valor `float' desde la cadena
    float valor;
    sscanf (cadena, "%f", &valor);
    cout << "El valor leido desde la cadena modificada es " << valor <<"\n";

    return 0;
}
¿Algo así se podría aplicar en tu caso?

Saludos
  #5 (permalink)  
Antiguo 21/08/2003, 07:54
 
Fecha de Ingreso: agosto-2003
Ubicación: Madrid
Mensajes: 8
Antigüedad: 21 años, 3 meses
Puntos: 0
El campo "Nota Media" es un campo numérico Access con valor decimal, cuyo separador decimal es la coma, siendo incompatible con c++, cuyo separador decimal es el punto. El ejemplo mostrado es muy muy valioso para mí, gracias. El caso es que necesito algo inmediato, alguna función inmediata o alguna forma que no requiera tanto código cada vez que necesite trabajar con datos numéricos fraccionarios. Gracias de verdad.
  #6 (permalink)  
Antiguo 21/08/2003, 08:31
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 6 meses
Puntos: 25
Si no puedes cambiar el tipo de datos de Access lo que yo haria es mandar el dato como cadena al C (no se si en Access funcione CAST o CONVERT dentro de un select).

asi el C lo recibe como cadena, haces una pequeña funcion que te busque la coma y la reemplace por un punto y lo conviertes a float (atof()).

Seguramente debe haber la forma de cambiar el tipo de datos en Access para que el separador sea el punto.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #7 (permalink)  
Antiguo 22/08/2003, 09:44
 
Fecha de Ingreso: agosto-2003
Ubicación: Madrid
Mensajes: 8
Antigüedad: 21 años, 3 meses
Puntos: 0
Muchisimas gracias mithrandir, eso ha funcionado. Desgraciadamente en access no hay posibilidad de hacer lo de los separadores decimales con puntos, ya que se rige por las regional settings. Pero ya he convertido el campo a cadena. Gracias y también muchísimas gracias a leonardop por aguantarme tanto ;)
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 14:23.