國際標準書號(International Standard Book Number,ISBN;是國際通用的圖書或獨立的出版物(除定期出版的期刊)代碼。出版社可以通過國際標準書號清晰的辨認所有非期刊書籍。一個國際標準書號只有一個或一份相應的出版物與之對應。新版本如果在原來舊版的基礎上沒有內容上太大的變動,在出版時也不會得到新的國際標準書號碼。當平裝本改為精裝本出版時,原來相應的國際標準書號號碼也應當收回。一本書的每一版或其他的變化能夠申請到一個新的國際標準書號。一般來說,號碼長度為是13碼或者10碼(在2007年1月1日之前)數字,由4或者5個部分組成:
1、如果13位數字的國際標準書號,一個GS1前導數字:通常為978或者979。
2、出版國家或者語言代碼。
3、出版商代碼。
4、書所分配到的號碼。
5、檢查碼。
13碼的國際標準號碼通常被分成5個部分(10碼為4部份),其不同部份以連字符-或者空格清楚分開,位數是可變化的,連字符在系統處理上可被忽略;前導位數保證能確保這串數字能被判斷為國際標準書號。若有必要,連字符號必須被正確地標明;他們能使用戶較清楚判斷出數字與出版商及所屬國家的關系,國際標準書號目錄(PIID),是一種非固定的周期性出版物。
過去SBN無國家及語言代碼,ISBN出現后,美國所出版的書國家代碼為0;1為英語系國家,2為法語系國家;3為德語系國家,4為日本,5適合俄語系國家,7為中國大陸等等。國家領域最長可能為5位數字(例不丹為99936),但相對剩下能使用、分配的位數就較為狹隘。負責國家國際標準書號會依出版社的大小來分配其位數范圍,出版商能擁有自己的代碼。沒有強制規定書上必須印制國際標準書號,但通常印制在版權頁及書底商品條形碼上方。出版商申請之后,能分配到國際標準書號的一個數字區域,組織會依使用量來預計出版商所需要的范圍,并分配之,越大的出版商所取得的位數越小(如此代表書碼的范圍可以容納更多)。一旦發現所分配的數字區域不敷使用,出版商能再分配到另一個范圍供其使用,也就是再獲得一個出版商編號。因此,各國家及各出版社的國際標準號碼位數會因其狀況來做做好的分配。
下面一個小方法判斷ISBN是否正確。檢驗方法:
(1)、10位的,書號從左到右的9個數,分別乘10、9、8···3、2、,然后求和并除以11得sum,最后一位為校驗碼c,c = 11-sum
(2)、13位的,從左至右將前12位數的取其奇位數和和偶位數和;將偶位數和乘3,并其與奇位數和的和,得加權和sum; 第13位校驗位計算方法,校驗位為c:c=10-sum
public class ISBNClass
{
private String isbn;
public String ISBN
{
get { return isbn; }
set { isbn = value; }
}
public ISBNClass(String iSBN)
{
this.isbn = iSBN;
}
// 獲取某位的ISBN字符
private static int GetISBNAt(String isbn, int index, bool xEnable)
{
char c = Convert.ToChar(isbn.Substring(index, 1));
int n = c - '0';
if (n < 0 || n > 9)
{
if (xEnable && (c == 'X' || c == 'x'))
{
n = 10;
}
}
return n;
}
// 檢查ISBN號碼
// 7687687787
public static bool CheckISBN(String isbn)
{
try
{
int checkNum = 0;
if (isbn.Length == 10)
{
int start = 10;
int total = 0;
for (int i = 0; i < isbn.Length - 1; ++i)
{
total += GetISBNAt(isbn, i, false) * start--;
}
checkNum = total % 11;
if (checkNum > 0)
{
checkNum = 11 - checkNum;
}
}
else
{
int total = 0;
for (int i = 0; i < isbn.Length - 1; ++i)
{
total += GetISBNAt(isbn, i, false) * (i % 2 == 0 ? 1 : 3);
}
checkNum = total % 10;
if (checkNum > 0)
{
checkNum = 10 - checkNum;
}
}
return GetISBNAt(isbn, isbn.Length - 1, true) == checkNum;
}
catch
{
return false;
}
}
}
轉載出處 https://www.cnblogs.com/braveboy/p/6558486.html
以上是轉載的,以下是我自己的
/// <summary>
/// 去除了橫杠的10/13位 ISBN
/// </summary>
/// <param name="isbn"></param>
/// <returns></returns>
public static bool ISBN(string isbn)
{
isbn = isbn.Replace("-", "").ToLower();
var length = isbn.Length;
return length switch
{
10 => ISBN_10(isbn),
13 => ISBN_13(isbn),
_ => false,
};
}
/// <summary>
/// 去除了橫杠的10位 ISBN
/// </summary>
/// <param name="isbn"></param>
/// <returns></returns>
private static bool ISBN_10(string isbn)
{
if (isbn.Length != 10)
{
return false;
}
int sum = 0;
for (int i = 10; i > 1; i--)
{
sum += i * Convert.ToInt32(isbn.Substring((10 - i), 1));
}
var s1 = sum % 11;
var n1 = 11 - s1;
var last = n1.ToString();
if (n1 == 10)
{
last = "x";
}
else if (n1 == 11)
{
last = "0";
}
return last == isbn.Substring(9, 1);
}
/// <summary>
/// 去除了橫杠的10位 ISBN
/// </summary>
/// <param name="isbn"></param>
/// <returns></returns>
private static bool ISBN_13(string isbn)
{
if (isbn.Length != 13)
{
return false;
}
var code = isbn.Substring(0, 12);
int sum = 0;
for (int i = 0; i < code.Length; i++)
{
if (i % 2 == 0)
{
sum += 1 * Convert.ToInt32(code.Substring(i, 1));
}
else
{
sum += 3 * Convert.ToInt32(code.Substring(i, 1));
}
}
var s1 = sum % 10;
int n1;
if (s1 == 0)
{
n1 = 0;
}
else
{
n1 = 10 - s1;
}
var last = isbn.Substring(12, 1);
return n1.ToString() == last;
}