admin管理员组文章数量:1287256
I have a javascript which validates an organisation/pany number but I need it in c#. Does anyone have something like this lying around?
It's not an assignment and I could translate it myself, but if someone's done it already I wouldn't have to go through the work =)
If it's country specific I need to use it in Sweden.
Here it is in javascript, found at
function organisationsnummer(nr) {
this.valid = false;
if (!nr.match(/^(\d{1})(\d{5})\-(\d{4})$/))
{
return false;
}
this.group = RegExp.$1;
this.controldigits = RegExp.$3;
this.alldigits = this.group + RegExp.$2 + this.controldigits;
if (this.alldigits.substring(2, 3) < 2)
{
return false
}
var nn = "";
for (var n = 0; n < this.alldigits.length; n++)
{
nn += ((((n + 1) % 2) + 1) * this.alldigits.substring(n, n + 1));
}
this.checksum = 0;
for (var n = 0; n < nn.length; n++)
{
this.checksum += nn.substring(n, n + 1) * 1;
}
this.valid = (this.checksum % 10 == 0) ? true : false;
}
Thanks in advance!
I have a javascript which validates an organisation/pany number but I need it in c#. Does anyone have something like this lying around?
It's not an assignment and I could translate it myself, but if someone's done it already I wouldn't have to go through the work =)
If it's country specific I need to use it in Sweden.
Here it is in javascript, found at http://www.jojoxx
function organisationsnummer(nr) {
this.valid = false;
if (!nr.match(/^(\d{1})(\d{5})\-(\d{4})$/))
{
return false;
}
this.group = RegExp.$1;
this.controldigits = RegExp.$3;
this.alldigits = this.group + RegExp.$2 + this.controldigits;
if (this.alldigits.substring(2, 3) < 2)
{
return false
}
var nn = "";
for (var n = 0; n < this.alldigits.length; n++)
{
nn += ((((n + 1) % 2) + 1) * this.alldigits.substring(n, n + 1));
}
this.checksum = 0;
for (var n = 0; n < nn.length; n++)
{
this.checksum += nn.substring(n, n + 1) * 1;
}
this.valid = (this.checksum % 10 == 0) ? true : false;
}
Thanks in advance!
Share Improve this question edited Aug 31, 2016 at 9:22 Kevin Kopf 14.2k14 gold badges58 silver badges69 bronze badges asked Apr 13, 2011 at 8:24 NiklasNiklas 13.2k23 gold badges82 silver badges122 bronze badges 2- could you provide some examples? – Vasiliy Ermolovich Commented Apr 13, 2011 at 8:28
- To also allow 'personnummer', unment this: if (this.alldigits.substring(2, 3) < 2) { return false } – oskare Commented Sep 7, 2016 at 13:20
3 Answers
Reset to default 7static bool OrganisationsNummer(string nr)
{
Regex rg = new Regex(@"^(\d{1})(\d{5})\-(\d{4})$");
Match matches = rg.Match(nr);
if (!matches.Success)
return false;
string group = matches.Groups[1].Value;
string controlDigits = matches.Groups[3].Value;
string allDigits = group + matches.Groups[2].Value + controlDigits;
if (Int32.Parse(allDigits.Substring(2, 1)) < 2)
return false;
string nn = "";
for (int n = 0; n < allDigits.Length; n++)
{
nn += ((((n + 1) % 2) + 1) * Int32.Parse(allDigits.Substring(n, 1)));
}
int checkSum = 0;
for (int n = 0; n < nn.Length; n++)
{
checkSum += Int32.Parse(nn.Substring(n, 1));
}
return checkSum % 10 == 0 ? true : false;
}
tests:
Console.WriteLine(OrganisationsNummer("556194-7986")); # => True
Console.WriteLine(OrganisationsNummer("802438-3534")); # => True
Console.WriteLine(OrganisationsNummer("262000-0113")); # => True
Console.WriteLine(OrganisationsNummer("14532436-45")); # => False
Console.WriteLine(OrganisationsNummer("1")); # => False
There is an online JavaScript to C# converter.
Likely there are tons of others, probably one is at least suitable to assist you in doing parts of the converstion.
On the other hand, it seems to be rather simple to manually convert those few lines.
More solid implementation
/// <summary>
/// Immutable value type for storing personal numbers
/// </summary>
public struct PersonalNumber : IEquatable<PersonalNumber>
{
private const string YearHundredOpt = @"(19|20)?"; // 19 or 20 only (optional)
private const string YearDecade = @"(\d{2})"; // any two digits
private const string Month = @"(0[1-9]|10|11|12)"; // 01 to 12
private const string Day = @"(0[1-9]|1\d|2\d|30|31)"; // 01 to 31
private const string SeparatorAndLastFourOpt = @"([-\+]?)(\d{4})?"; // optional - or + followed by any four digits (optional)
private const string RegExForValidation =
"^" + YearHundredOpt + YearDecade + Month + Day + SeparatorAndLastFourOpt + "$";
private static readonly Regex personNoRegex = new Regex(RegExForValidation, RegexOptions.Compiled);
private readonly string rawPersonalNumber;
private readonly string personalNumber;
private readonly bool isValid;
private readonly bool isPlus100YearsOld;
public PersonalNumber(string personalNumber)
{
rawPersonalNumber = personalNumber;
var matches = personNoRegex.Matches(personalNumber);
var normalizedYYMMDDXXXC = string.Empty;
isPlus100YearsOld = false;
foreach (Match match in matches)
{
if (match.Success)
{
normalizedYYMMDDXXXC = match.Groups[2].Value + match.Groups[3].Value +
match.Groups[4].Value + match.Groups[6].Value;
if (match.Groups[5].Success)
{
isPlus100YearsOld = match.Groups[5].Value == "+";
}
break;
}
}
if (normalizedYYMMDDXXXC.Length > 6)
{
isValid = personNoRegex.IsMatch(personalNumber) && LuhnAlgorithm.ValidateChecksum(normalizedYYMMDDXXXC);
}
else
{
isValid = personNoRegex.IsMatch(personalNumber);
}
this.personalNumber = string.IsNullOrEmpty(normalizedYYMMDDXXXC) ? rawPersonalNumber : normalizedYYMMDDXXXC;
}
public string Number { get { return personalNumber; } }
public bool IsPlus100YearsOld { get { return isPlus100YearsOld; } }
public bool IsValid { get { return isValid; } }
public bool IsMale { get { return !IsFemale; } }
public bool IsFemale
{
get
{
var genderCharacter = personalNumber.Substring(personalNumber.Length - 2, 1); // second to last character
return int.Parse(genderCharacter) % 2 == 0; // even = female, odd = male
}
}
public override string ToString() { return Number; }
public bool Equals(PersonalNumber other)
{
return Equals(other.personalNumber, personalNumber);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (obj.GetType() != typeof (PersonalNumber)) return false;
return Equals((PersonalNumber) obj);
}
public override int GetHashCode()
{
unchecked
{
int result = (rawPersonalNumber != null ? rawPersonalNumber.GetHashCode() : 0);
result = (result*397) ^ (personalNumber != null ? personalNumber.GetHashCode() : 0);
result = (result*397) ^ isValid.GetHashCode();
return result;
}
}
public static bool operator ==(PersonalNumber left, PersonalNumber right)
{
return left.Equals(right);
}
public static bool operator !=(PersonalNumber left, PersonalNumber right)
{
return !left.Equals(right);
}
}
and some tests for it
[TestClass]
public class PersonalNumberFixture
{
[TestMethod]
public void Ctor_PersonalNumber_AsUnformatted()
{
AssertExpectedNumber("7102240475", "7102240475");
AssertExpectedNumber("197102240475", "7102240475");
AssertExpectedNumber("19710224-0475", "7102240475");
AssertExpectedNumber("710224-0475", "7102240475");
}
private static void AssertExpectedNumber(string number, string expectedNumber)
{
Assert.AreEqual(expectedNumber, new PersonalNumber(number).Number);
}
[TestMethod]
public void FiltersAndRemovesPlusAndMinusCharactersCorrectly()
{
Assert.AreEqual("7102240475", new PersonalNumber("710224-0475").Number);
Assert.AreEqual("7102240475", new PersonalNumber("710224+0475").Number);
Assert.AreEqual("7102240475", new PersonalNumber("19710224-0475").Number);
Assert.AreEqual("7102240475", new PersonalNumber("19710224+0475").Number);
}
[TestMethod]
public void PlusAndMinusCharactersOnlyAllowedInCertainPositions()
{
Assert.IsTrue(new PersonalNumber("710224-0475").IsValid);
Assert.IsTrue(new PersonalNumber("710224+0475").IsValid);
Assert.IsFalse(new PersonalNumber("71022404-75").IsValid);
Assert.IsFalse(new PersonalNumber("71022404+75").IsValid);
Assert.IsFalse(new PersonalNumber("710-224-0475").IsValid);
Assert.IsFalse(new PersonalNumber("710224+04+75").IsValid);
}
[TestMethod]
public void MaleAndFemale_CorrectlyIdentified()
{
// female
Assert.IsFalse(new PersonalNumber("551213-7986").IsMale);
Assert.IsTrue(new PersonalNumber("551213-7986").IsFemale);
// male
Assert.IsTrue(new PersonalNumber("710224-0475").IsMale);
Assert.IsFalse(new PersonalNumber("710224-0475").IsFemale);
Assert.IsTrue(new PersonalNumber("19710224-0475").IsMale);
Assert.IsFalse(new PersonalNumber("19710224-0475").IsFemale);
}
[TestMethod]
public void Ctor_ValidPersonalNumbers_ParsedAsValid()
{
TestLoop_ValidPersonalNumbers(new[] { "7102240475", "197102240475", "19710224-0475", "710224-0475", "801231+3535", "630215" });
}
private static void TestLoop_ValidPersonalNumbers(IEnumerable<string> personalNumbers)
{
foreach (var personalNumber in personalNumbers)
{
var pn = new PersonalNumber(personalNumber);
Assert.IsTrue(pn.IsValid, string.Format("Pno = '{0}'", personalNumber));
}
}
[TestMethod]
public void ToString_EqualsNormalizedNumber()
{
Assert.AreEqual(new PersonalNumber("460126").ToString(), new PersonalNumber("460126").Number);
}
[TestMethod]
public void Ctor_InvalidPersonalNumbers_ParsedAsNotValid()
{
TestLoop_InvalidPersonalNumbers(new[] { "127102240475", "19710XY40475", "19710224=0475", "1971", "14532436-45", "556194-7986", "262000-0113", "460531-12" });
}
private static void TestLoop_InvalidPersonalNumbers(IEnumerable<string> personalNumbers)
{
foreach (var personalNumber in personalNumbers)
{
var pn = new PersonalNumber(personalNumber);
Assert.IsFalse(pn.IsValid, string.Format("Pno = '{0}'", personalNumber));
}
}
[TestMethod]
public void TwoNumbers_ConsideredEqual_IfNormalizedNumbersAreEqual()
{
new PersonalNumber("710224-0475");
Assert.IsTrue(new PersonalNumber("800212").Equals(new PersonalNumber("19800212")));
Assert.IsTrue(new PersonalNumber("800212").Equals(new PersonalNumber("800212")));
Assert.IsTrue(new PersonalNumber("8002121234").Equals(new PersonalNumber("19800212-1234")));
Assert.IsFalse(new PersonalNumber("800212").Equals(new PersonalNumber("900212")));
}
[TestMethod]
public void EqualsOperatorOverloaded_AsEquals()
{
Assert.IsTrue(new PersonalNumber("800212") == new PersonalNumber("19800212"));
Assert.IsTrue(new PersonalNumber("800212") == new PersonalNumber("800212"));
Assert.IsTrue(new PersonalNumber("8002121234") == new PersonalNumber("19800212-1234"));
Assert.IsTrue(new PersonalNumber("800212") != new PersonalNumber("900212"));
}
[TestMethod]
public void IsPlus100YearsOld()
{
Assert.IsFalse(new PersonalNumber("800213").IsPlus100YearsOld);
Assert.IsFalse(new PersonalNumber("800213-0123").IsPlus100YearsOld);
Assert.IsTrue(new PersonalNumber("800213+0123").IsPlus100YearsOld);
}
}
本文标签: javascriptc code to validate organisationcompany numberStack Overflow
版权声明:本文标题:javascript - c# code to validate organisationcompany number? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741221293a2361021.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论