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

Variable Moneda

Estas en el tema de Variable Moneda en el foro de Mysql en Foros del Web. Hola, tengo una variable que almacena un dato tipo moneda mexicana: $valor="$4,509.50" necesito guardar ese valor en un campo de una base de datos, el ...
  #1 (permalink)  
Antiguo 07/03/2012, 09:41
Avatar de GABRIL  
Fecha de Ingreso: febrero-2007
Mensajes: 280
Antigüedad: 14 años, 6 meses
Puntos: 4
Pregunta Variable Moneda

Hola, tengo una variable que almacena un dato tipo moneda mexicana:

$valor="$4,509.50"

necesito guardar ese valor en un campo de una base de datos, el campo se llama "importe"

mi pregunta es, que tipo de dato debo ponerle a ese campo?? si le pongo int ó decimal me guarda "0", necesito quitarle los simbolos y guardalo como decimal??

gracias espero sus comentarios, saludos.
__________________
"La soberbia nunca baja de donde sube, pero siempre cae de donde subió"
Francisco De Quevedo
  #2 (permalink)  
Antiguo 07/03/2012, 11:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 13 años, 9 meses
Puntos: 2658
Respuesta: Variable Moneda

El tipo de campo para moneda es DECIMAL, pero lo que tienes que hacer es guardar el numero, sin comas ni signo de moneda, y sólo como número, no como cadena:
Código PHP:
Ver original
  1. $valor="4509.50
El que luego lo muestres como
Cita:
$4,509.50
no tiene nada que ver con la forma en que lo guardas, sino con las funciones que luego uses para representarlo en pantalla.
Es un error muy habitual.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 07/03/2012, 11:35
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 14 años, 8 meses
Puntos: 447
Respuesta: Variable Moneda

Hola GABRIL:

La elección del tipo de datos dependerá de lo que necesites hacer con la información. ¿Necesitas ese dato para hacer algún tipo de cálculo? entonces si, será necesario guardar el campo de tipo de precisión para poder hacer operaciones. ¿El campo es meramente descriptivo y no requieres hacer ningún cálculo? entonces podrías optar (aunque no lo recomiendo) en ponerlo como varchar.

Hay que entender que una cosa es el dato y otra muy diferente es el formato en que presentas la información al usuario como bien comenta gnzsoloyo... Lamentablemente MySQL no cuenta con un tipo Money, como SQL Server o ACCESS pero proporciona los medios necesarios para poder manejar este tipo se situaciones. aquí algunas consideraciones que tienes que tomar en cuenta.

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (campo_numero DECIMAL(10,2), campo_texto VARCHAR(10));
  2.  
  3. Query OK, 0 rows affected (0.14 sec)
  4.  
  5. mysql> #la información es la misma, pero el dato es diferente
  6. mysql> INSERT INTO tabla VALUES (123.30, '123.30');
  7. Query OK, 1 row affected (0.03 sec)
  8.  
  9. mysql> #La precisión del número es sifnificativa, trunca al numero de decimanes
  10. mysql> INSERT INTO tabla VALUES (12345.67891, NULL);
  11. Query OK, 1 row affected, 1 warning (0.03 sec)
  12.  
  13. mysql> #La presición en el texto no importa
  14. INSERT INTO tabla VALUES (NULL, '1234567.891');
  15.  
  16. mysql> #no puedes almacenar números con sepadador de miles
  17. mysql> INSERT INTO tabla VALUES (1,123.30, NULL);
  18. ERROR 1136 (21S01): Column count doesnt match value count at row 1
  19.  
  20. mysql> #puedes cifras con separador de miles
  21. mysql> INSERT INTO tabla VALUES (NULL, '1,123.30');
  22. Query OK, 1 row affected (0.03 sec)
  23.  
  24. mysql> #pero también ualquier cosa que no sea una cifra
  25. mysql> INSERT INTO tabla VALUES (NULL, '1D"$%D.AD');
  26. Query OK, 1 row affected (0.03 sec)
  27.  
  28. mysql> #con numeros puedes realizar operaciones
  29. mysql> SELECT campo_numero, campo_numero * 0.16 iva FROM tabla;
  30. +--------------+-----------+
  31. | campo_numero | iva       |
  32. +--------------+-----------+
  33. |       123.30 |   19.7280 |
  34. |     12345.68 | 1975.3088 |
  35. |         NULL |      NULL |
  36. |         NULL |      NULL |
  37. +--------------+-----------+
  38. 4 rows in set (0.00 sec)
  39.  
  40. mysql> #con textos, las operaciones no son matemátivas
  41. mysql> SELECT campo_texto, campo_texto * 0.16 iva FROM tabla;
  42. +-------------+-------------+
  43. | campo_texto | iva         |
  44. +-------------+-------------+
  45. | 123.30      |      19.728 |
  46. | NULL        |        NULL |
  47. | 1,123.30    |        0.16 |
  48. | 1D#$%D.AD   |        0.16 |
  49. | 12.1234567  | 1.939753072 |
  50. +-------------+-------------+
  51. 5 rows in set, 2 warnings (0.00 sec)
  52.  
  53. mysql> #puedes presentar un numero en el formato que quieres
  54. mysql> SELECT campo_numero, FORMAT(campo_numero, 2) FROM tabla;
  55. +--------------+-------------------------+
  56. | campo_numero | FORMAT(campo_numero, 2) |
  57. +--------------+-------------------------+
  58. |       123.30 | 123.30                  |
  59. |     12345.68 | 12,345.68               |
  60. +--------------+-------------------------+
  61. 4 rows in set (0.00 sec)

Saludos
Leo.
  #4 (permalink)  
Antiguo 07/03/2012, 12:21
Avatar de GABRIL  
Fecha de Ingreso: febrero-2007
Mensajes: 280
Antigüedad: 14 años, 6 meses
Puntos: 4
Respuesta: Variable Moneda

Listo lo arregle, opte por guardar con el tipo de dato double, y para mostrar los datos en pantalla use la funcion number_format() con 2 decimales y me convierte la cantidad, solo le agrego el $ como texto. Gracias y si necesito para calculos.
Saludos.
__________________
"La soberbia nunca baja de donde sube, pero siempre cae de donde subió"
Francisco De Quevedo
  #5 (permalink)  
Antiguo 07/03/2012, 13:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 13 años, 9 meses
Puntos: 2658
Respuesta: Variable Moneda

Ten cuidado con DOUBLE, porque no se maneja igual que DECIMAL.
Double es un punto flotante, es decir un numero decimal por aproximación, mientras que DECIMAL es de precisión. Esto puede hacer que se generen redondeos con el DOUBLE que terminen ocasionado desfasajes en los cálculos, lo que no ocurrirá si usas DECIMAL.
El manual recomienda DECIMAL para los valores monetarios
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: moneda, variables, campos
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 16:23.