1

hola estoy haciendo un CRUD web y tengo un error: Cuando inserto una nueva fila si el campo "precio" contiene decimales me arroja NumberFormatException Buscando en Google descubrí que el error es por que el INPUT NUMBER del HTML que implementé usa "," para separar entre enteros y decimales y aparentemente java necesita que se use ".". Entonces cuando casteo el String , que viene del request que captura el input para convertirlo a double, me tira dicho error. Esto intenté solucionarlo de una manera un tanto sucia usando el .replaceAll y cambiando las "," por "." de la siguiente manera:

double precio = Double.parseDouble (request.getParameter("precio").replaceAll(",", "."));

Lo curioso, es que ya no me tira la excepcion pero ahora carga numeros sutilmente distintos con una cantidad exagerada de decimales que simplemente inventa. Por ejemplo: cargué en el input 23,11 y como resultado obtuve 23.110000610351562 en la base de datos SQL y así con todo. Cabe destacar que intente usar float y me tiraba otros errores. Otra cosa rara es que he visto tutoriales donde no hay ningún problema con el uso de double y base de datos y no deben hacer ningún rodeo para adaptarlo. ¿Por que yo si tengo problemas y otros no? ¿Cómo puedo solucionarlo?

favio
  • 89
  • 11
  • 1
    En cuanto a _cargué en el input 23,11 y como resultado obtuve 23.110000610351562_: [¿Por qué mis programas no pueden hacer cálculos aritméticos correctamente?](https://es.stackoverflow.com/questions/197/por-qu%c3%a9-mis-programas-no-pueden-hacer-c%c3%a1lculos-aritm%c3%a9ticos-correctamente). Y en cuanto al error de sintaxis, tenés una coma antes del `WHERE`. – padaleiana Sep 25 '21 at 11:13
  • ok gracias por la solución del WHERE pero en cuanto a lo primero sigo sin tener solución. solo una explicación del problema. Como hago para representar un precio y por que el profesor no tiene este problema? gracias. – favio Sep 26 '21 at 00:26

1 Answers1

1

Por lo que veo presentas varios problemas el 1ro es que el INPUT NUMBER que usas si no es el nativo de HTML debe de tener una api adicional un archivo que no bajaste con la configuración regional y una vez que lo tengas agregado a tu proyecto tienes que hacer algo así:

$.fn.select2.defaults.set("language", "es");
jQuery.datetimepicker.setLocale("es"); 

Aquí use un select2 para JQuery y un datetimepicker. Para ambos baje sus archivos de regionales de idioma y los inicialice con el código de arriba. Por ejemplo para el select2 su archivo era select2-i18n/es.js. Para el datepicker.min.js hay un archivo datepicker.es-ES.min.js y para el datetimepicker había un archivo con todos los idiomas jquery.datetimepicker.full.min.js Como no pones específicamente cual usas no puedo decirte como hacer eso exactamente.

La 2da cosa que tienes que revisar es la configuración regional de tu sistema operativo. En Windows ve a "Editar opciones de idioma y teclado" -> "Fecha, hora y formato regional"->"Opciones adicionales de fecha, hora y configuración regional"->En región "Cambiar formatos de fecha, hora o número" o ve directamente al panel de control y buscas Región y luego "Cambiar formatos de fecha, hora o número":

introducir la descripción de la imagen aquí

Luego vas a configuración adicional:

introducir la descripción de la imagen aquí

Cambia el símbolo decimal por ".". Y el símbolo de separación de miles por ",". Estas configuraciones terminaran afectando a tu IDE y al mismo java.

El 3er problema que veo es que tu campo se llama "precio", por lo cual vas a usar dinero y por lo tanto no puedes usar Double(64 bits) ni Float(32 bits) ya que internamente se resuelven con complemento a 2 y se terminan redondeando. Para manejar dinero debes usar la clase java.math.BigDecimal, porque tampoco sirve utilizar tipos money o moneda ni en java ni en base de datos para manejar dinero.

Entonces quedaria algo asi:

import java.math.BigDecimal

y despues

 BigDecimal precio =new BigDecimal(request.getParameter("precio").replaceAll(",", ""));

Es decir, si arreglas la configuración regional de tu INPUT NUMBER al recuperarlo en java solo tienes que eliminar la "," de separación de miles y usar el valor para crear un BigDecimal.

Otra cosa es que el javascript suele tener por defecto el idioma del navegador, si bajaste un navegador configurado para español de españa puede ser la razón por la que el símbolo de separador de decimales sea "," y no ".". Si es el caso tendrás que bajar alguno configurado con español internacional o latinoamérica.

Tienes que revisar todos estos puntos para corregir tu problema.

abrahamhs
  • 3,376
  • 1
  • 16
  • 39