Ver Mensaje Individual
  #3 (permalink)  
Antiguo 28/01/2014, 15:06
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 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