`
jsntghf
  • 浏览: 2531753 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

ISBN编码的转换

阅读更多

图书的ISBN有两种编码,一种长度是10位的,另一种是13位的。两者其实是可以用特定的算法相互推导的,关键在于最后一位校验码的计算。

 

先说10位计算到13位,10位的isbn编号是7111165616,转化到13位,遵循下面的算法: 去掉最后一位,在最前面加上978,变成978711116561 从第一个数字起,求每奇数位的和,记为a。9+8+1+1+6+6 = 31 从第二个数字起,求每偶数位的和,记为b。7+7+1+1+5+1 = 22 求a+3b,记为c。c = 97 求10-c并对结果取10的模,(10-c)%10 = 3。这就是校验位,加在第一步结果的最后。得到13位编码为:9787111165613

 

从13位到10位的计算方法更简单。13位编号是9787111165613,现在想把它转化为10位,可以这样做: 去掉开头的”978″和最后一位校验码,变成711116561 从第一位开始,将每一位和10到2的数字相乘,并求和;7*10 + 1*9 + 1* 8 + 1*7 + 1*6 + 6*5 + 5*4 + 6*3 + 1*2 = 170;记为c 求11-c并对结果取11的模:(11-c)%11 = 6;如果结果是10就记为X,然后把算出来的一位加到第一步结果的最后,得到10位编码为:7111165616

 

class IsbnFormat
  
  def initialize(isbn)
    @isbn = isbn.sub("-", "")
    if(@isbn.length == 10)
      @isbn = @isbn[0..8]
    elsif(@isbn.length == 13)
      @isbn = @isbn[3..11]
    else
      raise ArgumentError, "Bad ISBN"
    end    
  end
  
  def isbn10
    a = 11
    b = 0
    @isbn.length.times { |i|
      b += (a -= 1)*(@isbn[i] - 48)
    }
    ((11 - b)%11) == 10 ? @isbn + "X" : @isbn + (11 - (b % 11)).to_s
  end
  
  def isbn13
    temp = "978" + @isbn
    sum = 0
    i = 0
    temp.length.times{ |i|
      if(i % 2 == 0)
        sum += temp[i] - 48
      else
        sum += 3 * (temp[i] - 48)
      end
    }     
    temp + ((10 - sum) % 10).to_s
  end
end

 

我们可以这样来用它:

 

    require 'isbn_format'
    isbn = IsbnFormat.new '7111165616'
    isbn.isbn10  #=> 7111165616
    isbn.isbn13  #=> 9787111165613

 

参数可以用10位或13位的isbn,也可以带有横线,如7-1111-6561-6。如果参数的长度不对的话,有可能会抛出ArgumentError。

分享到:
评论

相关推荐

    ISBN转换工具(10位13位)

    本篇文章将详细介绍10位和13位ISBN的结构、转换方法以及如何使用“10位13位ISBN转换工具”进行转换。 ### 10位ISBN的构成 10位ISBN由五部分组成,每部分之间通常用破折号分隔: 1. **组区号**:代表出版物的地理或...

    c#图书条形码转换,isbn,9位,10位,13位互相转换,封装类,完整代码

    在这个项目中,我们关注的是C#编程语言中对这些编码进行转换的实现,特别是在9位、10位和13位ISBN之间的互换。以下是对这个主题的详细讲解: 首先,我们需要理解什么是ISBN。ISBN是International Standard Book ...

    ISBN13位与10位转换

    在图书行业中,国际标准书号(International Standard Book Number,简称ISBN)是用于唯一标识书籍的标准编码。ISBN系统自1970年起使用,随着时间的发展,它经历了从10位到13位的演变,以应对数量不断增长的出版物。...

    isbn10位转13位.rar

    10位的ISBN主要用于1970年至2006年间的书籍,而13位的ISBN则从2007年开始逐渐取代10位,以适应更广泛的编码需求和EAN(欧洲商品条码)系统。 1. **ISBN-10到ISBN-13的转换**: - ISBN-10由10个数字组成,通常以一...

    ISBN算法

    例如,"Unit1.pas"可能包含了处理ISBN和图书编码转换的函数或过程,而"Project2.dpr"是项目的主文件,定义了项目的整体结构。通过这些源码,开发者可以更深入地理解ISBN算法的实现细节,包括数据结构、输入输出处理...

    国际标准书号与图书条形码释义及其转换算法(ISBN)

    图书条形码则是将ISBN编码转化为机器可读的形式,使得书店、图书馆等机构可以快速准确地进行书籍的库存管理与销售。本文将深入探讨ISBN的构成、含义、转换算法以及与条形码的关系。 1. ISBN的构成 一个完整的ISBN由...

    信息论与编码.zip

    信源编码是将原始信息转换为适合传输的形式的过程。第二章可能涉及无损编码和有损编码的区别。无损编码如哈夫曼编码(Huffman Coding)和游程编码(Run-Length Encoding),能完全恢复原始信息;有损编码如JPEG图像...

    使用Excel制作的ISBN-10和ISBN-13生成器

    ISBN是一种在全球范围内唯一标识图书等出版物的编码系统,分为10位和13位两种形式。ISBN-10由10个数字组成,通常以978或979开头,最后一位是校验码,通过特定算法计算得出,确保整个号码的正确性。而ISBN-13是13位的...

    ISBN.rar_delphi 图书

    综上所述,这个Delphi项目是一个用于ISBN和图书编码转换的程序,具有快速处理能力。通过解压并运行这个项目,我们可以查看和学习如何在Delphi环境中实现这种转换算法,这对于Delphi开发者或对图书管理软件感兴趣的...

    一维条形码编码规则

    - **标准型Code93条形码**:包含46个字符,相比于Code39增加了4个特殊字符,用于转换到完整的ASCII字符集。 - **完全型Code93条形码**:包含128个字符,编码能力与Code128相当。 #### 14. Code11条形码 Code11条形...

    ISBN条形码识别源码

    它通过一系列黑白相间的条纹,将数据编码为可被机器快速读取的形式。在这个特定的项目中,我们关注的是ISBN(国际标准书号)条形码的识别,这是一种专门用于图书的标准条形码。"ISBN条形码识别源码"是一个C++编程...

    易语言isbn10位转13位源码

    13位ISBN是在2007年全面实施的,以扩展编码能力并容纳更多的出版物。 10位ISBN的格式通常为:X-999-99999-X,其中X代表一个校验码,可以是0-9或X(X表示10)。而13位ISBN的格式则为:978-99999-999-9,同样,最后一...

    易语言源码易语言isbn10位转13位源码.rar

    13位ISBN是在10位基础上通过特定算法转换得到的,以适应更广泛的编码需求。 转换规则如下: 1. 如果原10位ISBN以X结尾,那么X代表数字10。 2. 将10位ISBN的每一位数字乘以其权重(1、3、1、3、1、3、1、3、1),...

    10,13位条码转ISBN

    ### 10、13位条码转换为ISBN的知识点详解 #### 一、概述 在图书出版领域,ISBN(International Standard Book Number)国际标准书号是一种唯一标识图书的国际通用代码,它由一系列数字组成,用以识别图书的出版商...

    C 代码 确定国际标准书号的校验位 或报告给定的 ISBN 是否有效.rar

    3. **C语言实现**:在C语言中,可以定义一个函数,如`int calculate_ISBN_checksum(char* isbn)`,接收一个表示ISBN的字符串,然后逐个字符处理,将其转换为整数并进行加权求和。最后根据求和结果计算校验位。 4. *...

    图书芯片,RFID转换,

    2. **标签采购与编码**:购买符合标准的RFID图书标签,并根据图书信息进行个性化编码。 3. **标签安装**:将RFID标签安全地贴在每本书上,位置要确保不影响阅读且能有效读取。 4. **系统集成**:将新的RFID系统与...

    商品码ean13字体及EAN8-13编码规则

    每本书都有一个唯一的ISBN,它被转换为EAN13格式以便于条形码系统识别。通常,ISBN的10位数字前面会加上“978”或“979”作为前缀,再加上一个校验位,形成13位的EAN13条形码。 总结来说,EAN13和EAN8条形码是商品...

    Python库 | isbnlib_bnf-1.0.3-py2.py3-none-any.whl

    **ISBNlib_bnf** 是Python的一个开源库,它提供了一系列工具,帮助开发者验证、转换和操作与法国国家图书馆(BNF)相关的ISBN编码。BNF是法国的国家级图书馆,负责分配和管理法国出版物的ISBN。这个库特别适用于处理...

    Business::ISBN Perl module-开源

    3. **转换ISBN**:在ISBN-10和ISBN-13之间进行转换,以适应不同的需求。 4. **生成ISBN**:可能包括创建新的随机或基于特定规则的ISBN,以用于测试或其他目的。 5. **比较ISBN**:提供比较两个ISBN是否相同或相关的...

    PyPI 官网下载 | isbnlib-3.4.1.tar.gz

    4. **解码和编码**:`isbnlib.decode()`和`isbnlib.encode()`函数可以帮助将ISBN从人类可读的形式转换为机器友好的形式,反之亦然。 5. **获取书名和出版商**:通过`isbnlib.meta()`,开发者可以尝试从ISBN获取书籍...

Global site tag (gtag.js) - Google Analytics