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

Formato InputText para precios con Primefaces

Estas en el tema de Formato InputText para precios con Primefaces en el foro de Java en Foros del Web. Hola, estoy teniendo un problema a la hora de introducir precios en formularios. El caso es que me gustaría lo siguiente: Que se pueda introducir ...
  #1 (permalink)  
Antiguo 27/01/2014, 05:46
 
Fecha de Ingreso: noviembre-2013
Mensajes: 26
Antigüedad: 10 años, 5 meses
Puntos: 0
Formato InputText para precios con Primefaces

Hola, estoy teniendo un problema a la hora de introducir precios en formularios.

El caso es que me gustaría lo siguiente: Que se pueda introducir los precios tanto con coma (24,6€) como con punto (24.6€). Además me gustaría que se mostrara en las tablas únicamente los 2 primeros decimales.

Cuando pongo 24,6 me lo coge como 246, y me gustaría que fuera flexible en esto ya que quiero que se puedan usar ambos formatos. Luego el tema de los decimales tampoco consigo que lo haga bien. Tengo el siguiente código:

Código:
<h:outputLabel value="#{bean.precio*bean.cantidad} €" >
                  <f:convertNumber maxFractionDigits="2" />
           </h:outputLabel>
Pero me sigue saliendo mal. Por ejemplo, al meter como precio 4.39 y cantidad 6, me sale como resultado 26.339999999999996 cuando realmente es 26.34. Y además no hace caso al maxFractionDigits.

A ver si me podéis ayudar a solucionar estos 2 problemas.

Un saludo
  #2 (permalink)  
Antiguo 28/01/2014, 09:33
 
Fecha de Ingreso: noviembre-2013
Mensajes: 26
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Formato InputText para precios con Primefaces

Sigo sin encontrar solución, no entiendo por qué salen tantos decimales cuando no debería. :S
  #3 (permalink)  
Antiguo 28/01/2014, 15:06
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Formato InputText para precios con Primefaces

Hola,

Cita:
Iniciado por malome88 Ver Mensaje
... Que se pueda introducir los precios tanto con coma (24,6€) como con punto (24.6€). ...
Eso se llama internacionalización o I18N, básicamente esas dos expresiones no son lo mismo, y van a depender de la configuración regional que tengas establecida en la PC donde está corriendo Java.

Si la configuración está establecida para un país que use la coma como separador de decimales entonces va a usar esa lógica, si la configuración esta establecida de diferente forma, como el caso del punto, va a utilizar el punto.

Aunque puedes cambiar el 'Locale' o región cuando está corriendo tu aplicación, no es recomendable, principalmente porque es una configuración global de toda la aplicación, con sus respectivos problemas si la cambias y no la regresar a su valor original.

En el peor de los casos podrías hacer una conversión del número en el momento en que lo capturas, en el caso de JSF podrías utilizar un Converter.

Pero siempre va a depender del Locale, por ejemplo, si cambias el punto por una coma y la configuración del Locale es US, posiblemente tendrás el problema del 246 que mencionaste, es decir, no va a tomar en consideración la coma, puesto que en US se usa el punto.

http://docs.oracle.com/javase/7/docs...il/Locale.html

Lo normal es hacer las aplicaciones configurando el Locale en la PC y no tomar en consideración esas conversiones, posteriormente, configurar el Locale de la misma PC a otra región y hacer pruebas a que siga funcionando correctamente. De esta forma debería funcionar correctamente dependiendo de la configuración de la PC de la persona que esté usando la aplicación.

No es tan sencillo como pareciera a simple vista.

Cita:
Iniciado por malome88 Ver Mensaje
... Luego el tema de los decimales tampoco consigo que lo haga bien. Tengo el siguiente código:

Código:
<h:outputLabel value="#{bean.precio*bean.cantidad} €" >
                  <f:convertNumber maxFractionDigits="2" />
           </h:outputLabel>
Pero me sigue saliendo mal. Por ejemplo, al meter como precio 4.39 y cantidad 6, me sale como resultado 26.339999999999996 cuando realmente es 26.34. ...
Ese es otro problema que no es tan simple como pareciera a simple vista. Seguramente estás usando el tipo double, fácilmente lo puedes comprobar con una simple prueba:

Código Java:
Ver original
  1. double a = 4.39D;
  2. double b = 6D;
  3. double c = a * b;
  4. System.out.println(c);

El problema es que los números double y float se guardan de forma inexacta, es un concepto que relaciona la matemática y su representación limitada dentro la memoria de la PC. Para esos cálculos se usa normalmente BigDecimal.

Cita:
Iniciado por malome88 Ver Mensaje
...Y además no hace caso al maxFractionDigits. ...
Posiblemente, no estoy seguro completamente, pero creo que el problema proviene de que le estas poniendo el símbolo del Euro al final dentro del mismo outputLabel, es decir, para Java es un String cuando llega al convertNumber. (23.1€). Posiblemente puedas usar <f:convertNumber currencyCode="GBP" type="currency" />. http://www.mkyong.com/jsf2/jsf-2-convertnumber-example/

Saludos,

Última edición por HackmanC; 28/01/2014 a las 15:15 Razón: vínculo
  #4 (permalink)  
Antiguo 29/01/2014, 02:43
 
Fecha de Ingreso: noviembre-2013
Mensajes: 26
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Formato InputText para precios con Primefaces

Lo que me comentas del Locale es un auténtico lío. En la aplicación tengo diversas páginas donde introduzco precio. En una me admite el punto y en otra la coma como decimal. Todo esto sin poner locale, dejándolo por defecto, por lo que supongo que debería de coger por defecto el locale Español.

No hay forma de que en un input permita la coma y el punto como decimal?
  #5 (permalink)  
Antiguo 29/01/2014, 12:58
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Formato InputText para precios con Primefaces

Hola,

Cita:
Iniciado por malome88 Ver Mensaje
... En la aplicación tengo diversas páginas donde introduzco precio. En una me admite el punto y en otra la coma como decimal. Todo esto sin poner locale, dejándolo por defecto, por lo que supongo que debería de coger por defecto el locale Español. ...
Ese no es el funcionamiento normal de Java, no me puedo ni imaginar alguna forma de lograr ese comportamiento sin cambiar el Locale en JSF FacesContext.getCurrentInstance().getViewRoot().ge tLocale(). Posiblemente hay algo adicional, en la configuración u otros, que no has visto en tu aplicación, o en cada página, que permita ese funcionamiento.

Cita:
Iniciado por malome88 Ver Mensaje
... No hay forma de que en un input permita la coma y el punto como decimal? ...
En lo personal no conozco ninguna forma de que permita diferentes caracteres como separador decimal al mismo tiempo. O usas uno u otro, lógicamente puedes hacerlo manualmente con un Converter o algo parecido, que averigüe el Locale y lo convierta consecuentemente.

Hasta allí llega mi conocimiento al respecto,

Saludos,

Etiquetas: formato, precios, primefaces
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 22:46.