最近的工作中确实用到了很多的方法,有些比较复杂,所以我就去网络上进行查找,主要是一些各种各样的程序,效果比较好。
第一个程序是判断身份证号码的,这个只能判断18位身份证号,15位的身份证号没有后面的校验位。
public static bool CheckIDCard18(string idNumber)
{
long n = 0;
if (long.TryParse(idNumber.Remove(17), out n) == false
|| n < Math.Pow(10, 16) || long.TryParse(idNumber.Replace('x', '0').Replace('X', '0'), out n) == false)
{
return false;//数字验证
}
string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
if (address.IndexOf(idNumber.Remove(2)) == -1)
{
return false;//省份验证
}
string birth = idNumber.Substring(6, 8).Insert(6, "-").Insert(4, "-");
DateTime time = new DateTime();
if (DateTime.TryParse(birth, out time) == false)
{
return false;//生日验证
}
string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
char[] Ai = idNumber.Remove(17).ToCharArray();
int sum = 0;
for (int i = 0; i < 17; i++)
{
sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
}
int y = -1;
Math.DivRem(sum, 11, out y);
if (arrVarifyCode[y] != idNumber.Substring(17, 1).ToLower())
{
return false;//校验码验证
}
return true;//符合GB11643-1999标准
}
第二个程序是将阿拉伯数字金额转换成大写汉字金额。
法一是强大的正则表达式:
public static string ConvertToChinese(Decimal number)
{
var s = number.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A");
var d = Regex.Replace(s, @"((?<=-|^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))", "${b}${z}");
var r = Regex.Replace(d, ".", m => "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟万亿兆京垓秭穰"[m.Value[0] - '-'].ToString());
return r;
}
但是这种方法实在是太神奇了,一下子有些看不懂,所以在实际使用中我采用了我修改网络上的代码的法二。
法二是是采用逐位赋值然后进行对得到的结果进行处理得到实际需要的结果。
public static string GetChinese(Decimal number)
{
string valueStr = number.ToString();
if (valueStr.Length > 16)
return "金额长度过长,无法转换";
double m;
double.TryParse(valueStr, out m);
valueStr = m.ToString("0000000000000000.00");
valueStr = Regex.Replace(valueStr, @"\.", "");
string digit = "零壹贰叁肆伍陆柒捌玖";
string Dom = "仟佰拾万仟佰拾亿仟佰拾万仟佰拾元角分";
string stringstore;
StringBuilder chBuilder = new StringBuilder();
for (int i = 0; i < valueStr.Length; i++)
{
chBuilder.Append(digit[valueStr[i] - '0']);
chBuilder.Append(Dom[i]);
}
stringstore = chBuilder.ToString();
stringstore = Regex.Replace(stringstore, "零仟", "零");
stringstore = Regex.Replace(stringstore, "零佰", "零");
stringstore = Regex.Replace(stringstore, "零拾", "零");
stringstore = Regex.Replace(stringstore, "零零零零万", "");
stringstore = Regex.Replace(stringstore, "零零零零亿", "");
while (Regex.IsMatch(stringstore, "零零"))
stringstore = Regex.Replace(stringstore, "零零", "零");
stringstore = Regex.Replace(stringstore, "零亿", "亿");
stringstore = Regex.Replace(stringstore, "零万", "万");
stringstore = Regex.Replace(stringstore, "零元", "元");
stringstore = Regex.Replace(stringstore, "零角零分", "");
stringstore = Regex.Replace(stringstore, "零分", "");
stringstore = Regex.Replace(stringstore, "零角", "零");
while (stringstore.StartsWith("零"))
stringstore = stringstore.Substring(1, stringstore.Length - 1);
return stringstore;
}
这个代码只能转换16位的金额,再大的一点的话应该也不会有那么多钱吧,16位中2位是小数,我觉得这个方法应该还是容易看懂的。
第三个程序是计算两个日期之间相差的天数,再转换成字符串表示结果。
public static string Timediff(DateTime dtstart, DateTime dtend)
{
string timediff = string.Empty;
int D = 0, M = 0, Y = 0;
while (DateTime.Compare(dtstart.AddYears(Y), dtend) <= 0)
Y++;
while (DateTime.Compare(dtstart.AddYears(Y - 1).AddMonths(M), dtend) <= 0)
M++;
while (DateTime.Compare(dtstart.AddYears(Y - 1).AddMonths(M - 1).AddDays(D), dtend) <= 0)
D++;
timediff = (Y - 1).ToString("0000") + (M - 1).ToString("00") + (D - 1).ToString("00");
if (Y == 0)
return "00000000";
else
return timediff;
}
这个方法比较简单,就是利用DateTime类的ADD特性计算出时间差,得到结果为“0000(年)00(月)00(日)”,如果起始日期大于截止日期,显示的结果也为“00000000”,再对字符串进行一些处理皆可以转换成汉字并且加上年月日,在这里我就不写了,那个比较简单。