php - remove - strip_tags wordpress
¿Mejores prácticas para trabajar con valores de moneda en PHP? (4)
Necesito agregar, multiplicar y comparar valores de moneda en PHP y debo estar seguro de que es exactamente de un centavo.
Una forma es almacenar todo en flotador, usarlo antes y después de cada operación y hacer una máquina mental al comparar la igualdad. Imho bastante engorroso.
Otra forma es almacenar todo en centavos en tipos de datos enteros, y recuerde convertirlos en cualquier momento que trabaje con la base de datos (mysql, donde uso el tipo de datos decimal). Inelegante, y muchas trampas de error, imho.
Otra forma es inventar mi propio "tipo de datos", almacenar todos los valores en cadenas ("34.12") y crear mis propias funciones matemáticas de reemplazo. Estas funciones convertirían el valor a números enteros internamente, realizarían el cálculo y emitirían el resultado nuevamente como cadenas. Sorprendentemente complicado, imho.
Mi pregunta: ¿cuál es la mejor práctica para trabajar con valores monetarios en PHP? ¡Gracias!
Déjame contestar esto yo mismo. La mejor práctica sería crear una clase de "cantidad de dinero". Esta clase almacena la cantidad internamente como centavos en enteros, y ofrece captadores, definidores, funciones matemáticas como sumar, restar y comparar. Mucho más limpio.
Mantenga los valores como centavos y use números enteros. Escriba clases o funciones de ayuda para encapsular la visualización en la interfaz de usuario y el manejo de los valores en sus consultas de base de datos. Si usas flotador, hay demasiado riesgo de que pierdas un centavo en alguna parte.
Actualización 2016:
Un par de años más tarde y ojalá un poco más sabio;)
Como esta respuesta aún recibe el voto ascendente y descendente ocasional, sentí la necesidad de revisar mi respuesta. Absolutamente ya no aconsejo almacenar el ''dinero'' como enteros. La única respuesta verdadera es la de Andrew Dunn: use el tipo DECIMAL de Mysql y encapsule las funciones bc_ * de php en una clase de moneda.
Mantendré mi respuesta obsoleta aquí para completar la información.
Siempre debes trabajar con enteros. Almacene los valores como ints en su base de datos, use ints para hacer cálculos y cuándo, y solo cuando, desea imprimirlos, conviértalos a algún formato legible.
De esta manera, usted evita por completo los problemas de punto flotante, lo que, en general, es un gran problema cuando se trabaja con dinero;)
Edición: una cosa que vale la pena mencionar: debe pensar en la precisión antes de comenzar a trabajar de esta manera. Como otros lo han señalado, es posible que necesites trabajar con valores menores a un centavo, por lo que necesitas hacer tu multiplicación / división en consecuencia. (es decir, moneda * 1000 para una precisión de .001)
A partir de MySQL v5.0.3, el DECIMAL
datos DECIMAL
de MySQL almacena un número decimal exacto, es decir, no es una representación de punto flotante inexacta.
Para manipular correctamente los números de precisión en PHP use las funciones matemáticas de precisión arbitraria . Internamente esta biblioteca manipula cadenas de texto.
La moneda está destinada a ser almacenada como un número decimal, puede obtener unidades de dinero más pequeñas que centavos. Solo debe redondear los valores al mostrar las figuras, no durante la manipulación o el almacenamiento.