Pregunta

Estoy probando una aplicación web usando servlets y JSP y necesito modelar el número de ISBN de un elemento en mi clase, así como en mapeos hibernados. ¿Cuál debería ser el tipo de un número ISBN? Me había encontrado con muchos tutoriales que usan cualquiera de ellos. ISBN supuestamente es un identificador de 10 dígitos ... a veces se encuentra con números como 0-85131-041-9 que no pueden ser un largo. Algunos ejemplos usan números sin guiones.

Entonces, ¿cuál debería ser del tipo? ¿Alguna sugerencia?

Gracias

Marcos

¿Fue útil?

Solución

Lo almacenaría en un Long propiedad y use un formateador/analizador (esencialmente, un convertidor). Cuando lo vaya a mostrar, el convertidor debe convertir el Long propiedad a una representación humana con guiones en los lugares correctos. Cuando va a validarlo/persistirlo, el convertidor debe eliminar todos los guiones del valor enviado y ponerlo en un Long propiedad.

Básicamente, es la misma idea que usaría para un Date campo que formatea/analiza en la representación humana con ayuda de SimpleDateFormat. La única diferencia es que el formateador/analizador ISBN no está disponible por la API Java SE estándar. Debería escribir uno usted mismo o adoptar una tercera (de la cual ninguno viene a la mente existente). Finalmente, este convertidor se puede usar como una etiqueta JSP (como JSTL's <fmt:formatDate>) o una clase Java independiente que es invoca por una función EL o cuando está utilizando JSF, un @FacesConverter clase.

Debido al complejo del número de ISBN, esto de hecho se almacena más que a menudo como un String para que el desarrollador no necesite preocuparse por los patrones válidos. Si eso es bueno o malo es una pregunta que debes hacerte a ti mismo y a tu equipo.

Otros consejos

ISBN tiene 13 dígitos (ver wiki). Usaría una clase que verifique la validez de String. Algo como:

class ISBN {
  private String isbn;
  public ISBN(String isbn) throws ISBNFormatException {
    // you might want to filter hyphens first, before the check
    if(ISBN.isValid(isbn)) this.isbn = isbn;
    else throw new ISBNFormatException(isbn);
  }
  public static boolean isValid(String s) {
   // validate number here, see wiki
  }
}

Esto, por supuesto, puede ser demasiado. Si su aplicación es realmente simple, puede ir con String bien.

Editar La guión divide el número en grupos (idioma, editor, etc.). Sin embargo, en cuanto a la singularidad del número, la guión (o división con espacios) no juega ningún papel.

En realidad ISBN no son 10 dígitos sino 12 dígitos + un cheque ISBN Preguntas frecuentes El cheque puede ser una x

El método para determinar el dígito de verificación para el ISBN es el módulo 11 con los factores de ponderación 10 a 1. El número X romano se usa en lugar de 10 donde diez ocurriría como un dígito de verificación.

Si está almacenando información que un usuario ha escrito, debe incluir el dígito de verificación y, por lo tanto, esta debe ser una cadena.

Si está almacenando el ISBN real, puede ignorar el cheque, ya que puede calcularlo. Sin embargo, si usa los nuevos 12 dígitos, los números son mayores de lo largo que pueden contener los viejos 10 dígitos, entonces podrían mantenerse en mucho tiempo, pero tendría que recordar posiblemente agregar 0s de regreso. Por lo tanto, en este caso lo mantendría en una cadena eliminando todos los datos no numéricos, por ejemplo, los guiones.

También mirando las preguntas frecuentes, hay una posible razón para almacenar la división ISBN para permitir la búsqueda por piezas.

Las cinco partes de un ISBN son las siguientes:
1. El ISBN-13 actual será prefijado por "978"
2. Identificador de grupo o país que identifica una agrupación nacional o geográfica de editores;
3. Identificador del editor que identifica a un editor en particular dentro de un grupo;
4. Identificador de título que identifica un título o edición particular de un título;
5. Compruebe el dígito es el dígito único al final del ISBN que valida el ISBN.

y 5 no es necesario guardarlo, ya que se puede calcular, pero debe capturarse de los usuarios para validar la entrada.

Esta pregunta realmente no tiene nada que ver con J2EE, sino simplemente con los tipos de datos Java y tal vez los tipos de datos en el motor de su base de datos.

Si desea incluir los guiones en cualquier salida, entonces tiene que almacenarlo como una cadena. A menos que desee escribir código para descubrir a dónde van los guiones, pero las reglas detrás de las que son bastante complicadas, dependiendo de los valores de los dígitos al comienzo del número. (Si está trabajando en un sistema que asigna ISBNS o los desarma y funciona con las piezas, tal vez desee hacer esto. Si solo desea que el usuario lo escriba y lo recuerde, esto suena como demasiados problemas .)

Supongo que si no te importan los guiones, puedes usar una cadena o un largo. Aún así, una larga sería un dolor extra en el sentido de que tendría que averiguar cuándo mostrar ceros principales.

Respuesta corta: No veo ninguna ventaja para almacenarlo como un número. Usa una cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top