Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 22nd, 2012  |  syntax: None  |  size: 9.67 KB  |  hits: 33  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. c# code to validate organisation/company number?
  2. function organisationsnummer(nr) {
  3.  this.valid = false;
  4.  if (!nr.match(/^(d{1})(d{5})-(d{4})$/)) { return false; }
  5.  this.group = RegExp.$1;
  6.  this.controldigits = RegExp.$3;
  7.  this.alldigits = this.group + RegExp.$2 + this.controldigits;
  8.  if (this.alldigits.substring(2, 3) < 2) { return false }
  9.  var nn = "";
  10.  for (var n = 0; n < this.alldigits.length; n++) { nn += ((((n + 1) % 2) + 1) * this.alldigits.substring(n, n + 1)); }
  11.  this.checksum = 0;
  12.  for (var n = 0; n < nn.length; n++) { this.checksum += nn.substring(n, n + 1) * 1; }
  13.  this.valid = (this.checksum % 10 == 0) ? true : false;
  14. }
  15.        
  16. static bool OrganisationsNummer(string nr)
  17. {
  18.     Regex rg = new Regex(@"^(d{1})(d{5})-(d{4})$");
  19.     Match matches = rg.Match(nr);
  20.  
  21.     if (!matches.Success)
  22.         return false;
  23.  
  24.     string group = matches.Groups[1].Value;
  25.     string controlDigits = matches.Groups[3].Value;
  26.     string allDigits = group + matches.Groups[2].Value + controlDigits;
  27.  
  28.     if (Int32.Parse(allDigits.Substring(2, 1)) < 2)
  29.         return false;
  30.  
  31.     string nn = "";
  32.  
  33.     for (int n = 0; n < allDigits.Length; n++)
  34.     {
  35.         nn += ((((n + 1) % 2) + 1) * Int32.Parse(allDigits.Substring(n, 1)));
  36.     }
  37.  
  38.     int checkSum = 0;
  39.  
  40.     for (int n = 0; n < nn.Length; n++)
  41.     {
  42.         checkSum += Int32.Parse(nn.Substring(n, 1));
  43.     }
  44.  
  45.     return checkSum % 10 == 0 ? true : false;
  46. }
  47.        
  48. Console.WriteLine(OrganisationsNummer("556194-7986")); # => True
  49. Console.WriteLine(OrganisationsNummer("802438-3534")); # => True
  50. Console.WriteLine(OrganisationsNummer("262000-0113")); # => True
  51. Console.WriteLine(OrganisationsNummer("14532436-45")); # => False
  52. Console.WriteLine(OrganisationsNummer("1")); # => False
  53.        
  54. /// <summary>
  55. /// Immutable value type for storing personal numbers
  56. /// </summary>
  57. public struct PersonalNumber : IEquatable<PersonalNumber>
  58. {
  59.     private const string YearHundredOpt = @"(19|20)?"; // 19 or 20 only (optional)
  60.     private const string YearDecade = @"(d{2})"; // any two digits
  61.     private const string Month = @"(0[1-9]|10|11|12)"; // 01 to 12
  62.     private const string Day = @"(0[1-9]|1d|2d|30|31)"; // 01 to 31
  63.     private const string SeparatorAndLastFourOpt = @"([-+]?)(d{4})?"; // optional - or + followed by any four digits (optional)
  64.  
  65.     private const string RegExForValidation =
  66.         "^" + YearHundredOpt + YearDecade + Month + Day + SeparatorAndLastFourOpt + "$";
  67.  
  68.     private static readonly Regex personNoRegex = new Regex(RegExForValidation, RegexOptions.Compiled);
  69.  
  70.     private readonly string rawPersonalNumber;
  71.     private readonly string personalNumber;
  72.     private readonly bool isValid;
  73.     private readonly bool isPlus100YearsOld;
  74.  
  75.     public PersonalNumber(string personalNumber)
  76.     {
  77.         rawPersonalNumber = personalNumber;
  78.  
  79.         var matches = personNoRegex.Matches(personalNumber);
  80.         var normalizedYYMMDDXXXC = string.Empty;
  81.         isPlus100YearsOld = false;
  82.         foreach (Match match in matches)
  83.         {
  84.             if (match.Success)
  85.             {
  86.                 normalizedYYMMDDXXXC = match.Groups[2].Value + match.Groups[3].Value +
  87.                               match.Groups[4].Value + match.Groups[6].Value;
  88.                 if (match.Groups[5].Success)
  89.                 {
  90.                     isPlus100YearsOld = match.Groups[5].Value == "+";
  91.                 }
  92.                 break;
  93.             }
  94.         }
  95.  
  96.         if (normalizedYYMMDDXXXC.Length > 6)
  97.         {
  98.             isValid = personNoRegex.IsMatch(personalNumber) && LuhnAlgorithm.ValidateChecksum(normalizedYYMMDDXXXC);
  99.         }
  100.         else
  101.         {
  102.             isValid = personNoRegex.IsMatch(personalNumber);
  103.         }
  104.  
  105.         this.personalNumber = string.IsNullOrEmpty(normalizedYYMMDDXXXC) ? rawPersonalNumber : normalizedYYMMDDXXXC;
  106.     }
  107.  
  108.     public string Number { get { return personalNumber; } }
  109.     public bool IsPlus100YearsOld { get { return isPlus100YearsOld; } }
  110.     public bool IsValid { get { return isValid; } }
  111.     public bool IsMale { get { return !IsFemale; } }
  112.  
  113.     public bool IsFemale
  114.     {
  115.         get
  116.         {
  117.             var genderCharacter = personalNumber.Substring(personalNumber.Length - 2, 1); // second to last character
  118.             return int.Parse(genderCharacter) % 2 == 0; // even = female, odd = male
  119.         }
  120.     }
  121.  
  122.     public override string ToString() { return Number; }
  123.  
  124.     public bool Equals(PersonalNumber other)
  125.     {
  126.         return Equals(other.personalNumber, personalNumber);
  127.     }
  128.  
  129.     public override bool Equals(object obj)
  130.     {
  131.         if (ReferenceEquals(null, obj)) return false;
  132.         if (obj.GetType() != typeof (PersonalNumber)) return false;
  133.         return Equals((PersonalNumber) obj);
  134.     }
  135.  
  136.     public override int GetHashCode()
  137.     {
  138.         unchecked
  139.         {
  140.             int result = (rawPersonalNumber != null ? rawPersonalNumber.GetHashCode() : 0);
  141.             result = (result*397) ^ (personalNumber != null ? personalNumber.GetHashCode() : 0);
  142.             result = (result*397) ^ isValid.GetHashCode();
  143.             return result;
  144.         }
  145.     }
  146.  
  147.     public static bool operator ==(PersonalNumber left, PersonalNumber right)
  148.     {
  149.         return left.Equals(right);
  150.     }
  151.  
  152.     public static bool operator !=(PersonalNumber left, PersonalNumber right)
  153.     {
  154.         return !left.Equals(right);
  155.     }
  156. }
  157.        
  158. [TestClass]
  159. public class PersonalNumberFixture
  160. {
  161.     [TestMethod]
  162.     public void Ctor_PersonalNumber_AsUnformatted()
  163.     {
  164.         AssertExpectedNumber("7102240475", "7102240475");
  165.         AssertExpectedNumber("197102240475", "7102240475");
  166.         AssertExpectedNumber("19710224-0475", "7102240475");
  167.         AssertExpectedNumber("710224-0475", "7102240475");
  168.     }
  169.  
  170.     private static void AssertExpectedNumber(string number, string expectedNumber)
  171.     {
  172.         Assert.AreEqual(expectedNumber, new PersonalNumber(number).Number);
  173.     }
  174.  
  175.     [TestMethod]
  176.     public void FiltersAndRemovesPlusAndMinusCharactersCorrectly()
  177.     {
  178.         Assert.AreEqual("7102240475", new PersonalNumber("710224-0475").Number);
  179.         Assert.AreEqual("7102240475", new PersonalNumber("710224+0475").Number);
  180.  
  181.         Assert.AreEqual("7102240475", new PersonalNumber("19710224-0475").Number);
  182.         Assert.AreEqual("7102240475", new PersonalNumber("19710224+0475").Number);
  183.     }
  184.  
  185.     [TestMethod]
  186.     public void PlusAndMinusCharactersOnlyAllowedInCertainPositions()
  187.     {
  188.         Assert.IsTrue(new PersonalNumber("710224-0475").IsValid);
  189.         Assert.IsTrue(new PersonalNumber("710224+0475").IsValid);
  190.         Assert.IsFalse(new PersonalNumber("71022404-75").IsValid);
  191.         Assert.IsFalse(new PersonalNumber("71022404+75").IsValid);
  192.         Assert.IsFalse(new PersonalNumber("710-224-0475").IsValid);
  193.         Assert.IsFalse(new PersonalNumber("710224+04+75").IsValid);
  194.     }
  195.  
  196.     [TestMethod]
  197.     public void MaleAndFemale_CorrectlyIdentified()
  198.     {
  199.         // female
  200.         Assert.IsFalse(new PersonalNumber("551213-7986").IsMale);
  201.         Assert.IsTrue(new PersonalNumber("551213-7986").IsFemale);
  202.  
  203.         // male
  204.         Assert.IsTrue(new PersonalNumber("710224-0475").IsMale);
  205.         Assert.IsFalse(new PersonalNumber("710224-0475").IsFemale);
  206.         Assert.IsTrue(new PersonalNumber("19710224-0475").IsMale);
  207.         Assert.IsFalse(new PersonalNumber("19710224-0475").IsFemale);
  208.     }
  209.  
  210.     [TestMethod]
  211.     public void Ctor_ValidPersonalNumbers_ParsedAsValid()
  212.     {
  213.         TestLoop_ValidPersonalNumbers(new[] { "7102240475", "197102240475", "19710224-0475", "710224-0475", "801231+3535", "630215" });
  214.     }
  215.  
  216.     private static void TestLoop_ValidPersonalNumbers(IEnumerable<string> personalNumbers)
  217.     {
  218.         foreach (var personalNumber in personalNumbers)
  219.         {
  220.             var pn = new PersonalNumber(personalNumber);
  221.  
  222.             Assert.IsTrue(pn.IsValid, string.Format("Pno = '{0}'", personalNumber));
  223.         }
  224.     }
  225.  
  226.     [TestMethod]
  227.     public void ToString_EqualsNormalizedNumber()
  228.     {
  229.         Assert.AreEqual(new PersonalNumber("460126").ToString(), new PersonalNumber("460126").Number);
  230.     }
  231.  
  232.     [TestMethod]
  233.     public void Ctor_InvalidPersonalNumbers_ParsedAsNotValid()
  234.     {
  235.         TestLoop_InvalidPersonalNumbers(new[] { "127102240475", "19710XY40475", "19710224=0475", "1971", "14532436-45", "556194-7986", "262000-0113", "460531-12" });
  236.     }
  237.  
  238.     private static void TestLoop_InvalidPersonalNumbers(IEnumerable<string> personalNumbers)
  239.     {
  240.         foreach (var personalNumber in personalNumbers)
  241.         {
  242.             var pn = new PersonalNumber(personalNumber);
  243.  
  244.             Assert.IsFalse(pn.IsValid, string.Format("Pno = '{0}'", personalNumber));
  245.         }
  246.     }
  247.  
  248.     [TestMethod]
  249.     public void TwoNumbers_ConsideredEqual_IfNormalizedNumbersAreEqual()
  250.     {
  251.         new PersonalNumber("710224-0475");
  252.         Assert.IsTrue(new PersonalNumber("800212").Equals(new PersonalNumber("19800212")));
  253.         Assert.IsTrue(new PersonalNumber("800212").Equals(new PersonalNumber("800212")));
  254.         Assert.IsTrue(new PersonalNumber("8002121234").Equals(new PersonalNumber("19800212-1234")));
  255.  
  256.         Assert.IsFalse(new PersonalNumber("800212").Equals(new PersonalNumber("900212")));
  257.     }
  258.  
  259.     [TestMethod]
  260.     public void EqualsOperatorOverloaded_AsEquals()
  261.     {
  262.         Assert.IsTrue(new PersonalNumber("800212") == new PersonalNumber("19800212"));
  263.         Assert.IsTrue(new PersonalNumber("800212") == new PersonalNumber("800212"));
  264.         Assert.IsTrue(new PersonalNumber("8002121234") == new PersonalNumber("19800212-1234"));
  265.  
  266.         Assert.IsTrue(new PersonalNumber("800212") != new PersonalNumber("900212"));
  267.     }
  268.  
  269.     [TestMethod]
  270.     public void IsPlus100YearsOld()
  271.     {
  272.         Assert.IsFalse(new PersonalNumber("800213").IsPlus100YearsOld);
  273.         Assert.IsFalse(new PersonalNumber("800213-0123").IsPlus100YearsOld);
  274.  
  275.         Assert.IsTrue(new PersonalNumber("800213+0123").IsPlus100YearsOld);
  276.     }
  277. }