C# 验证组织/公司编号的c代码?
我有一个验证组织/公司编号的javascript,但我需要c#格式。有人有这样的东西吗 这不是一项作业,我可以自己翻译,但如果有人已经完成了,我就不必完成这项工作=)C# 验证组织/公司编号的c代码?,c#,javascript,regex,validation,C#,Javascript,Regex,Validation,我有一个验证组织/公司编号的javascript,但我需要c#格式。有人有这样的东西吗 这不是一项作业,我可以自己翻译,但如果有人已经完成了,我就不必完成这项工作=) 如果它是针对特定国家的,我需要在瑞典使用它 这里是javascript,可以在 职能机构制造商(nr){ this.valid=false; 如果(!nr.match(/^(\d{1})(\d{5})\-(\d{4})$/) { 返回false; } this.group=RegExp.$1; this.controldigits
如果它是针对特定国家的,我需要在瑞典使用它 这里是javascript,可以在 <代码>职能机构制造商(nr){ this.valid=false; 如果(!nr.match(/^(\d{1})(\d{5})\-(\d{4})$/) { 返回false; } this.group=RegExp.$1; this.controldigits=RegExp.$3; this.alldigits=this.group+RegExp.$2+this.controldigits; if(此.alldigits.substring(2,3)<2) { 返回错误 } var nn=“”; 对于(var n=0;n
另一方面,手动转换这几行似乎相当简单。更可靠的实现
static 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;
}
/// <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);
}
}
//
///用于存储个人号码的不可变值类型
///
public struct PersonalNumber:IEquatable
{
private const string YearHundredOpt=@“(19|20)?;//仅限19或20(可选)
private const string YearDecade=@“(\d{2})”;//任意两位数字
private const string Month=@“(0[1-9]| 10 | 11 | 12);//01到12
private const string Day=@“(0[1-9]| 1\d | 2\d | 30 | 31);//01到31
private const string separator和lastfouropt=@“([-\+])(\d{4}”);//可选-或+后跟任意四位数字(可选)
私有常量字符串RegExForValidation=
“^”+年百分位数+年十位数+月+日+分隔符和最后四位数+“$”;
私有静态只读Regex personNoRegex=newregex(RegExForValidation,RegexOptions.Compiled);
私有只读字符串编号;
私有只读字符串personalNumber;
私有只读bool是有效的;
私有只读bool isplus100yearsed;
公共PersonalNumber(字符串PersonalNumber)
{
rawPersonalNumber=个人号码;
var matches=personNoRegex.matches(personalNumber);
var normalizedyymddxxxc=string.Empty;
isplus100yearsell=假;
foreach(匹配中的匹配)
{
如果(匹配成功)
{
normalizedyymddxxxc=match.Groups[2]。值+match.Groups[3]。值+
match.Groups[4]。Value+match.Groups[6]。Value;
if(match.Groups[5]。成功)
{
isplus100yearsell=match.Groups[5]。值==“+”;
}
打破
}
}
如果(规格化YYMMDDXXXC.Length>6)
{
isValid=personNoRegex.IsMatch(personalNumber)和&LuhnAlgorithm.ValidateChecksum(normalizedyymmdxxxc);
}
其他的
{
isValid=personNoRegex.IsMatch(personalNumber);
}
this.personalNumber=string.IsNullOrEmpty(normalizedyymddxxxc)?rawPersonalNumber:normalizedyymddxxxc;
}
公共字符串编号{get{return personalNumber;}}
公共bool isplus100yearselled{get{return isplus100yearselled;}}
公共bool是有效的{get{return是有效的;}}
公共bool IsMale{get{return!IsFemale;}
公共场所是女性
{
得到
{
var genderCharacter=personalNumber.Substring(personalNumber.Length-2,1);//倒数第二个字符
返回int.Parse(genderCharacter)%2==0;//偶数=女性,奇数=男性
}
}
公共重写字符串ToString(){return Number;}
公共布尔等于(个人数字其他)
{
返回等于(其他.personalNumber,personalNumber);
}
公共覆盖布尔等于(对象对象对象)
{
if(ReferenceEquals(null,obj))返回false;
if(obj.GetType()!=typeof(PersonalNumber))返回false;
返回等于((个人号码)obj);
}
公共覆盖int GetHashCode()
{
未经检查
{
int result=(rawPersonalNumber!=null?rawPersonalNumber.GetHashCode():0);
结果=(结果*397)^(personalNumber!=null?personalNumber.GetHashCode():0);
结果=(结果*397)^isValid.GetHashCode();
返回结果;
}
}
公共静态布尔运算符==(PersonalNumber左,PersonalNumber右)
{
返回左。等于(右);
}
公共静态布尔运算符!=(PersonalNumber左,PersonalNumber右)
{
返回!左。等于(右);
}
}
还有一些测试
[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);
}
}
[TestClass]
公共类PersonalNumberFixture
{
[测试方法]
公共无效字符\u个人号码\u a信息()
{
资产预期编号(“7102240475”、“7102240475”);
资产预期编号(“197102240475”、“7102240475”);
资产预期编号(“19710224-0475”、“7102240475”);
资产预期编号(“710224-0475”、“7102240475”);
}
私有静态void AssertExpectedNumber(字符串编号,字符串expectedNumber)
{
Assert.AreEqual(expectedNumber、new PersonalNumber(number).number);
}
[测试方法]
public void filters和movesplus与minumcharacters直接()
{
Assert.AreEqual(“7102240475”,新的个人号码(“710224-0475”)。号码);
Assert.AreEqual(“7102240475”,新的个人号码(“710224+0475”)。号码);
Assert.AreEqual(“7102240475”,新的个人号码(“19710224-0475”)。号码);
Assert.AreEqual(“7102240475”,新的个人号码(“19710224+0475”)。号码);
/// <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);
}
}
[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);
}
}