正确的方法来模拟j2ee app中的isbn数字

时间:2011-06-13 18:28:23

标签: java java-ee isbn

我正在使用servlet和jsps尝试一个Web应用程序,并且需要在我的类和hibernate映射中模拟isbn数量的项目。 哪个应该是isbn数字的类型?Long还是String?我遇到过很多使用其中任何一个的教程。 据说isbn是一个10位数的标识符。有时你会遇到像0-85131-041-9这样不能长的数字。有些例子使用没有连字符的数字..

那么,应该是哪种类型?有什么建议吗?

感谢

标记

4 个答案:

答案 0 :(得分:3)

ISBN有13位数字(请参阅wiki)。我会使用一个检查给定String的有效性的类。类似的东西:

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
  }
}

当然,这可能有点太多了。如果您的应用非常简单,那么您可以选择String

修改连字符将数字分成组(语言,发布者等)。但是,至于数字的唯一性,连字符(或带空格的除法)不起作用。

答案 1 :(得分:3)

实际上,ISBN不是10位数字,而是12位数字+支票ISBN FAQ支票可以是X

  

确定ISBN的校验位的方法是模数11,加权因子为10比1.罗马数字X代替10,其中10作为校验位。

如果您要存储用户输入的信息,则应包括校验位,因此必须是字符串。

如果您要存储实际的ISBN,那么您可以忽略该检查,因为您可以计算它。但是,如果使用新的12位数字,则数字大于长数字可以容纳的数字,如果旧的10位数字然后它可以保持很长但你必须记住可能添加前导0。因此,在这种情况下,我会将其保存在字符串中,删除所有非数字数据,例如连字符。

同时查看该常见问题解答,可能有理由存储ISBn拆分以允许按部分搜索。

  

ISBN的五个部分如下:
    1.目前的ISBN-13将以“978”为前缀     2.标识出版商的国家或地理分组的组或国家标识符;
  3.标识组内特定发布者的发布者标识符;
  4.标题标识符,用于标识标题的特定标题或版本;
  5.校验位是ISBN末尾的单个数字,用于验证ISBN。

和5不需要保存,因为它可以计算,但需要从用户捕获以验证输入。

答案 2 :(得分:2)

这个问题与J2EE无关,只与Java数据类型有关,也可能与数据库引擎上的数据类型有关。

如果要在任何输出中包含连字符,则几乎不必将其存储为字符串。除非您想编写代码来确定连字符的位置,但其背后的规则相当复杂,具体取决于数字开头的数字值。 (如果你正在开发一个分配ISBN或将它们拆开并与这些部分分开工作的系统,也许你想要这样做。如果你只是想让用户输入并记住它,这听起来太麻烦了。)

我想如果你不关心连字符,可以使用String或long。不过,长时间的痛苦是因为你必须弄清楚何时显示前导零。

简短回答:我认为将其存储为数字并没有任何好处。使用字符串。

答案 3 :(得分:0)

我将它存储在Long属性中并使用格式化程序/解析器(本质上是转换器)。当您要显示它时,转换器应该只将Long属性转换为在正确位置使用连字符的人工表示。当您要验证/保留它时,转换器应从提交的值中删除所有连字符并将其放在Long属性中。

基本上,它与您在Date字段中使用的想法相同,您在SimpleDateFormat的帮助下在人工表示中格式化/解析。唯一的区别是标准Java SE API无法使用ISBN格式化程序/解析器。你需要自己写一个或采用第三方(虽然没有现成的)。最后,这个转换器可以用作JSP标记(如JSTL的<fmt:formatDate>)或独立的Java类,它由EL函数调用,或者当您使用JSF时,@FacesConverter类。

由于ISBN编号的复杂性,这确实经常存储为String,因此开发人员无需担心有效模式。无论是好还是坏都是你要问自己和你的团队的问题。