EAN•UCC
前缀 组区号 出版者号 出版序号 校验码
1、取ISBN前12位
数字
               9   7   8   7   5   0   6   4   2   5   9   5   ?
2、取各位数字所
对应的加权值
               1   3   1   3   1   3   1   3   1   3   1   3 
3、将各位数字与
其相对应的加权值依次相乘
               9  21   8   21  5  0   6  12  2  15   9  15
4、将乘积相加,
得出和数 123
5、用和数除以模数10,得出余数 123÷10=12……3
6、模数10减余数,所得差即为校验码 10-3=7
7、将所得校验码放在构成中国标准书号的基本数字的末端 978-7-5064-2595-7
8、如果步骤5所得余数为0,则校验码为0。求各位老师给写一个算法,非常感谢。

解决方案 »

  1.   

    //参考如下代码
    public char ISBN(string ANumbers)
    {
        int vSum = 0; // 合计值
        int i = 1; // 加权值
        foreach (char vChar in ANumbers)
        {
            if ("0123456789".IndexOf(vChar) < 0) continue; // 非数字
            vSum += (vChar - '0') * i;
            i = i == 1 ? 3 : 1; // if (i == 1) i = 13; else i = 1;
        }
        return "01234567890"[10 - vSum % 10];
    }private void button1_Click(object sender, EventArgs e)
    {
        Text = ISBN("978750642595").ToString();
    }
      

  2.   

    你写的就是算法,你用程序实现就可以了。当然,你应该还有个判断,就是ISBN.Substring(4,1)这个字符如果是“0”,那么出版社社号只有2位,如果是“1”或“2”那么就是3位,如果是“5”就是4位,如果是“8”就是5位,如果是“9”就是6位,相应的流水段位数也有相应变化,因为最后一位是校验码,固定1位。
      

  3.   

    首先谢谢zswang了,zjsyw也给了一条思路。我是问各位老师怎样先取第1位、第3位、第5位、第7位、第9位、第11位的和乘以1
                      后取第2位、第4位、第6位、第8位、第10位、第12位的和乘以3。
    我不知道用什么方法取,我是新手。望各位老师给一个代码,先谢了。
      

  4.   

    using System;
    using System.Text.RegularExpressions;namespace BarCode
    {
     /// <summary>
     /// Summary description for BarCode2ISBN.
     /// </summary>
     public class BarCode2ISBN
     {
      public BarCode2ISBN()
      {
       //
       // TODO: Add constructor logic here
       //
      }
      #region ISBN_BarCode
      //条码 转 ISBN:
      //条码示例:9787508027104 前三位978(中国)
      // 1. 除去前三位及最后一位(4),剩下7 5 0 8 0 2 7 1 0(A)
      // 2. 高位 -> 低位(分别乘以10,9,8..3,2),即7*10,5*9,0*8...1*3,0*2。
      // 3. 求和:70 45 0 56 0 10 28 3 0 = 212;
      // 4. 和除以11: 212 % 11 余3
      // 5. 余数3取11的补数:11 - 3 = 8;(8即为校验位)
      //    注:当余数为0时,校验位为 0,余数为1时,补数为10,此时用符号X代替。
      // 6. 结果ISBN的书号为:A值加检验位8,即得:7 5 0 8 0 2 7 1 0 8
      public string BarCodeToISBN(string barCode)
      {
       if(barCode.Length != 13) return string.Empty;
       if(!Regex.IsMatch(barCode, @"\d{13}")) return string.Empty;
       string coreCode = barCode.Substring(3, 9);
       int sum = 0;
       for(int i = 10; i >= 2; i--)
       {
        sum += i * Convert.ToInt32(coreCode.Substring(10 - i,1));
       }
       string checkCode = null;
       if(sum % 11 == 0)
       {
        checkCode = "0";
       }
       else if(sum % 11 == 1)
       {
        checkCode = "X";
       }
       else
       {
        checkCode = (11 - (sum % 11)).ToString();
       }
       return coreCode + checkCode;
      }  //ISBN 转 条码:
      //示范数据:7-5080-2710-8
      // 1. 去掉末尾校验码8,前面统一加上978(中国),为:978750802710
      // 2. 从代码位置序号2开始,所有偶数位的数字代码求和为a, 7 + 7 + 0 + 0 + 7 + 0 = 21
      // 3. 将a乘以3为a, 21 * 3 = 63
      // 4. 从代码位置序号1开始,所有奇数位的数字代码求和为b,9 + 8 + 5 + 8 + 2 + 1 = 33 
      // 5. 将a和b相加为c, 63 + 33 = 96
      // 6. 取c的个位数d。 个位:6 
      // 7. 用10减去d即为校验位数值,将它置于最后一位。10 - 6 = 4 
      // 8. 条形码为:9 7 8 7 5 0 8 0 2 7 1 0 4
      public string ISBNToBarCode(string isbnCode)
      {
       isbnCode = isbnCode.Replace("-", string.Empty);
       if(isbnCode.Length != 10) return string.Empty;
       if(!Regex.IsMatch(isbnCode, @"\d{10}")) return string.Empty;
       string coreCode = isbnCode.Substring(0, 9);
       string chinaIsbnCode = "978";
       string tmpCode = chinaIsbnCode + coreCode;
       int sumOddNumber = 0;//奇数和
       int sumEvenNumber = 0;//偶数和
       for(int i = 0; i < 12; i++)
       {
        if( (i + 1) % 2 == 1)
        {
         sumOddNumber += Convert.ToInt32(tmpCode.Substring(i, 1));
        }
        else
        {
         sumEvenNumber += Convert.ToInt32(tmpCode.Substring(i, 1));
        }
       }   int sum = sumOddNumber + sumEvenNumber * 3;
       string checkCode = null;
       if(sum % 10 == 0)
       {
        checkCode = "0";
       }
       else
       {
        checkCode = (10 - (sum % 10)).ToString();
       }   return tmpCode + checkCode;
      }
      #endregion
     }
    }来自: 大可山的博客(http://blog.csdn.net/johnsuna/) 本文参考:http://blog.csdn.net/johnsuna/archive/2006/01/12/577511.aspx