C#学习教程:屏蔽除字符串前6位和后4位以外的所有数字(长度不同)作为字符串的卡号,例如:stringClsCommon.str_CardNumberr="3456123434561234";根据要求,此卡号的长度可以在16到19位之间变化。我的要求是我必须显示卡号的前六位和后四位数字,并用字符“X”屏蔽其中的其他字符。我尝试使用subString并分别实现16、17、18、19位数字。我将字符串(ClsCommon.str_CardNumber)拆分为5个字符串(str_cardNum1、str_cardNum2、str_cardNum3、str_cardNum4、str_cardNum5-每个字符串4位。第5个字符串的剩余数字)所有字符串都放在ClsCommon文件中。基于此我发现了以下,它完成了美国工作:if(ClsCommon.str_CardNumber.Length==16){txtmskcrdnum.Text=string.Concat(ClsCommon.str_cardNum1,"",ClsCommon.str_cardNum2.Substring(0,2),"XX","","XXXX","",ClsCommon.str_cardNum4);}if(ClsCommon.str_CardNumber.Length==17){txtmskcrdnum.Text=string.Concat(ClsCommon.str_cardNum1,"",ClsCommon.str_cardNum2.Substring(0,2),"XX","","XXXX","","X",ClsCommon.str_cardNum4.Substring(1,3),"",ClsCommon.str_cardNum5);}if(ClsCommon.str_CardNumber.Length==18){txtmskcrdnum.Text=string.Concat(ClsCommon.str_cardNum1,"",ClsCommon.str_cardNum2.Substring(0,2),"XX","","XXXX","","XX",ClsCommon.str_cardNum4.Substring(2,2),"",ClsCommon.str_cardNum5);}if(ClsCommon.str_CardNumber.Length==19){txtmskcrdnum.Text=string.Concat(ClsCommon.str_cardNum1,"",ClsCommon.str_cardNum2.Substring(0,2),"XX","","XXXX","","XXX",ClsCommon.str_cardNum4.Substring(3,1),"",ClsCommon.str_card数字5);}txtmskcrdnum.Text=ClsCommon.str_CardNumber.PadLeft(ClsCommon.str_CardNumber.Length,'X').Substring(ClsCommon.str_CardNumber.Length-4);对于多个长度,上面的方法没有用我想要一个显示前6和后4数字的方法,并用X屏蔽其他数字。最后一个字符串每4位之间应该有一个空格。这适用于任何卡号长度:varcardNumber="3456123434561234";varfirstDigits=cardNumber.Substring(0,6);varlastDigits=cardNumber.Substring(cardNumber.Length-4,4);varrequiredMask=newString('X',cardNumber.Length-firstDigits.Length-lastDigits.Length);varmaskedString=string.Concat(firstDigits,requiredMask,lastDigits);varmaskedCardNumberWithSpaces=Regex.Replace(maskedString,".{4}","$0");我会做这样的事情(伪C#——采用粗略的想法来构建)。未经测试的代码...stringMaskDigits(stringinput){//取前6个字符stringfirstPart=input.Substring(0,6);//取最后4个字符intlen=input.Length;字符串lastPart=输入。子串(len-4,4);//取中间部分(XXXXXXXX)intmiddlePartLenght=input.Substring(6,len-4).Count();stringmiddlePart=newString('X',5);返回firstPart+middlePart+lastPart;}尝试这个。简单明了。publicstaticclassStringExtensions{publicstaticstringMasked(thisstringsource,intstart,intcount){returnsource.Masked('x',start,count);}publicstaticstringMasked(thisstringsource,charmaskValue,intstart,intcount){varfirstPart=source.Substring(0,start);varlastPart=source.Substring(start+count);varmiddlePart=newstring(maskValue,count);返回firstPart+middlePart+lastPart;}}可能的现实(接受各种格式,例如数字可以分组等):privatestaticStringMaskedNumber(Stringsource){StringBuildersb=newStringBuilder(source);常量intskipLeft=6;constintskipRight=4;int左=-1;对于(inti=0,c=0;iskipLeft){left=i;休息;}}}for(inti=sb.Length-1,c=0;i>=left;--i)if(Char.IsDigit(sb[i])){c+=1;如果(c>skipRight)sb[i]='X';}返回sb.ToString();}//测试//3456-12XX-XXXX-1234Console.Write(MaskedNumber("3456-1234-3456-1234"));//3456123XXXXX1234Console.Write(MaskedNumber("3456123434561234"));此实现仅屏蔽数字并保留格式一种方式:stringmasked=null;for(inti=0;i5&&i我确定有一种更简洁的方法可以做到这一点:intcurrentChar=0;stringmaskable="11111144441111";stringmasked=maskable;intlength=masked.Length;intstartMaskPoint=6;intendMaskPoint=length-4-startMaskPoint;masked=masked.Remove(startMaskPoint,endMaskPoint);intnumRemoved=length-masked.Length;stringMask="";while(numRemoved!=0){掩码=掩码+"#";numRemoved--;}masked=masked.Insert(startMaskPoint,Mask);stringreturnableString=masked;while(length>4){returnableString=returnableString.Insert(currentChar+4,"");currentChar=currentChar+5;length=length-4;}如何使用正则表达式替换特定的匹配组:stringcardNumber="3456123434561234";varpattern="^(.{6})(.+)(.{4})$";varmaskedNumber=Regex.Replace(cardNumber,pattern,(match)=>{returnRegex.Replace(String.Format("{0}{1}{2}",match.Groups[1].Value,//前6位数字newString('X',match.Groups[2].Value.Length),//X乘以'X'字符match.Groups[3].Value)/*最后4位数字*/,".{4}","$0");//最后每4个字符添加一个分隔符});许多给定的解决方案多次解析输入。下面我提出一个只解析一次输入的解决方案。但我没有使用C#的经验,所以函数是用Scheme编写的。函数分为两个:(1)visit-first-6解析前六个字符并将它们连接到其余的计算中。当visit-first-6解析完前六个字符后,它调用visit-rest。(2)Access-rest利用了这样一个事实,即我们可以延迟一些计算,直到我们有更多的知识。在这种情况下,我们等到知道还剩多少个字符后才确定是否应显示列表中的元素。(define(maskxs)(letrec([visit-first-6(lambda(xschars-parsed)(cond[(null?xs);;短于6个字符。'()][(在PetiteChezScheme翻译运行中面具>(面具'(123456789101112131415161718))(123456“X”“X”“X”“X”“X”“X""X""X"15161718)>(掩码'())()>(掩码'(1234))(1234)>(掩码'(12345))(12345)>(掩码'(123456789))(123456789)>(掩码'(12345678910))(12345678910)>(mask'(1234567891011))(123456"X"891011)注意。我以为这是一个有趣的练习,我想我也会分享它。YannickMeeus已经提供了一个易于理解的解决方案。因此,这仅适用于感兴趣的人。Linq节省了编码行和小代码片段。大于6,小于CardPan的长度减4,用(*)char代替。以上是C#学习教程:屏蔽除字符串前6位和后4位以外的所有数字(不同长度)分享所有内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注---varCardPan="1234567890123456";varmaskedPan=CardPan.Aggregate(string.Empty,(value,next)=>{if(value.Length>=6&&value.Length本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处:
