Necesito saber como podría corregir esa conexión o simplemente si existe alguna variable tipo float pero con separadores siendo comas.
Gracias.
![lloron](http://static.forosdelweb.com/fdwtheme/images/smilies/chillando.png)
| |||
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. ![]() |
| |||
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:
Un cordial saludo $ 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 |
| |||
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. ![]() |
| |||
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:
¿Algo así se podría aplicar en tu caso?#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; } Saludos |
| |||
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. |
| |||
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 ;) |