/// <summary> /// 文字列からISBNコードを読み取ります。 /// <para> /// 文字列に数字以外の文字が含まれている場合、それらは単に無視されます。 /// ISBNコードの各部分を区分するハイフンはあってもなくても読み取り結果に影響を与えません。 /// </para> /// </summary> /// <param name="s">文字列</param> /// <returns>読み取り結果</returns> /// <exception cref="ArgumentNullException">引数が<c>null</c>の場合</exception> /// <exception cref="ArgumentException">グループ記号(Group identifier)や出版者記号(Publisher prefix)が特定できなかった場合</exception> public static IsbnCode Parse(string s) { CheckUtility.MustNotBeEmpty(s, nameof(s)); var digits = GetNormalizedDigits(s); var flagDigits = digits.Substring(0, 3); var checkDigit = digits[12]; var group = RegistrationGroups.GetGroups() .FirstOrDefault(g => digits.StartsWith(g.PrefixWithoutHyphen)); if (group == null) { throw new ArgumentException("Unknown group."); } var groupDigits = digits.Substring(3, group.PrefixWithoutHyphen.Length - 3); var restDigits = digits.Substring(group.PrefixWithoutHyphen.Length, digits.Length - group.PrefixWithoutHyphen.Length - 1); var rule = group.Rules.Where(r => r.Length > 0) .FirstOrDefault(r => RestDigitsFollowToRule(restDigits, r)); if (rule == null) { throw new ArgumentException("Unknown publisher"); } var pubDigits = restDigits.Substring(0, rule.Length); var titleDigits = restDigits.Substring(rule.Length, restDigits.Length - rule.Length); return(new IsbnCode(flagDigits, groupDigits, pubDigits, titleDigits, checkDigit, group.Agency)); }
/// <summary> /// 文字列を元にこのクラスのインスタンスを生成します。 /// </summary> /// <param name="value">文字列</param> /// <returns>インスタンス</returns> /// <exception cref="ArgumentException">文字列に数字以外の文字が含まれているか、文字列が空である場合</exception> /// <exception cref="ArgumentNullException">文字列が<c>null</c>である場合</exception> public static Digits Of(string value) { CheckUtility.MustNotBeEmpty(value, nameof(value)); if (Regex.IsMatch(value, "[^0-9]")) { throw new ArgumentException("Non-digit character is found."); } return(new Digits(value)); }
internal RegistrationGroupRule(string range, int length) { CheckUtility.MustNotBeEmpty(range, nameof(range)); CheckUtility.MustBeGreaterThanOrEqual0(length, nameof(length)); var rs = range.Split('-'); RangeStart = rs[0].Substring(0, length); RangeEnd = rs[1].Substring(0, length); Length = length; }
internal RegistrationGroup(string prefix, string agency, IEnumerable <RegistrationGroupRule> rules) { CheckUtility.MustNotBeEmpty(prefix, nameof(prefix)); CheckUtility.MustNotBeEmpty(agency, nameof(agency)); CheckUtility.MustNotBeEmpty(rules, nameof(rules)); Prefix = prefix; PrefixWithoutHyphen = prefix.Replace("-", string.Empty); Agency = agency; Rules = rules; }