public bool IsValidIsbn(string isbn)
var numericalString = RemoveInsignificantISBNCharacters(isbn);
var length = string.IsNullOrEmpty(numericalString) ? 0 : numericalString.Length;
return IsValidIsbn10(numericalString);
return IsValidIsbn13(numericalString);
private bool IsValidIsbn10(string s)
if (string.IsNullOrEmpty(s))
foreach (var c in s.Substring(0,s.Length-1))
valid = char.IsNumber(c);
var lastChar = s.Substring(s.Length - 1, 1);
return valid && ComputeIsbn10CheckDigit(s)==lastChar;
private bool IsValidIsbn13(string s)
if(string.IsNullOrEmpty(s))
valid = char.IsNumber(c);
var lastDigit = Convert.ToInt16(s.Substring(s.Length - 1, 1));
return valid && ComputeIsbn13CheckDigit(s) == lastDigit;
private int ComputeIsbn13CheckDigit(string isbn13)
isbn13 = isbn13.Substring(0, isbn13.Length - 1);
for(var i=0; i < isbn13.Length; i++)
sum += Convert.ToInt16(isbn13[i].ToString()) * 3;
sum += Convert.ToInt16(isbn13[i].ToString());
return (10 - sum % 10) % 10;
private string ComputeIsbn10CheckDigit(string isbn10)
isbn10 = isbn10.Substring(0, isbn10.Length - 1);
for (var i = 0; i < isbn10.Length; i++)
sum += Convert.ToInt16(isbn10[i].ToString()) * (i + 1);
return result == 10 ? "X" : result.ToString();
private string RemoveInsignificantISBNCharacters(string s)
return !string.IsNullOrEmpty(s) ? s.Replace(" ", string.Empty).Replace("-", string.Empty) : s;