题
我有一个从导入文件中提取的压缩字符串值。我需要将其格式化为包裹号码,其格式如下: ##-##-##-###-###
. 。因此,字符串“410151000640”应变为“41-01-51-000-640”。我可以使用以下代码来做到这一点:
String.Format("{0:##-##-##-###-###}", Convert.ToInt64("410151000640"));
但是,字符串可能不全是数字;它可能包含一两个字母,因此转换为 int 将会失败。有没有办法在字符串上执行此操作,以便每个字符,无论是数字还是字母,都可以正确地适应格式?
解决方案
Regex.Replace("410151000640", @"^(.{2})(.{2})(.{2})(.{3})(.{3})$", "$1-$2-$3-$4-$5");
或稍短的版本
Regex.Replace("410151000640", @"^(..)(..)(..)(...)(...)$", "$1-$2-$3-$4-$5");
其他提示
只要您知道“包裹号”始终符合特定规则,我将通过拥有自己的格式化方法来解决这个问题。
public static string FormatParcelNumber(string input)
{
if(input.length != 12)
throw new FormatException("Invalid parcel number. Must be 12 characters");
return String.Format("{0}-{1}-{2}-{3}-{4}",
input.Substring(0,2),
input.Substring(2,2),
input.Substring(4,2),
input.Substring(6,3),
input.Substring(9,3));
}
在您的情况下,这应该有效:
string value = "410151000640";
for( int i = 2; i < value.Length; i+=3){
value = value.Insert( i, "-");
}
现在 value
包含插入破折号的字符串。
编辑
我刚刚看到,您在每一个数字之间都没有破折号,因此需要进行一些小调整(并且恐怕它也会更加笨拙)
string value = "410151000640";
for( int i = 2; i < value.Length-1; i+=3){
if( value.Count( c => c == '-') >= 3) i++;
value = value.Insert( i, "-");
}
如果是UI的一部分,您可以使用 MaskedTextProvider
在 System.ComponentModel
MaskedTextProvider prov = new MaskedTextProvider("aa-aa-aa-aaa-aaa");
prov.Set("41x151000a40");
string result = prov.ToDisplayString();
如果我理解正确的话,您正在寻找一个从字符串中删除所有字母的函数,不是吗?
我已经即时创建了这个,如果您正在寻找的话,也许您可以将其转换为 c#:
Dim str As String = "410151000vb640"
str = String.Format("{0:##-##-##-###-###}", Convert.ToInt64(MakeNumber(str)))
Public Function MakeNumber(ByVal stringInt As String) As String
Dim sb As New System.Text.StringBuilder
For i As Int32 = 0 To stringInt.Length - 1
If Char.IsDigit(stringInt(i)) Then
sb.Append(stringInt(i))
End If
Next
Return sb.ToString
End Function
这是一个简单的扩展方法,具有一些实用程序:
public static string WithMask(this string s, string mask)
{
var slen = Math.Min(s.Length, mask.Length);
var charArray = new char[mask.Length];
var sPos = s.Length - 1;
for (var i = mask.Length - 1; i >= 0 && sPos >= 0;)
if (mask[i] == '#') charArray[i--] = s[sPos--];
else
charArray[i] = mask[i--];
return new string(charArray);
}
使用如下:
var s = "276000017812008";
var mask = "###-##-##-##-###-###";
var dashedS = s.WithMask(mask);
您可以将其与任何字符串和###中的任何字符一起使用。面具将从右至左工作。您可以根据需要对其进行调整以另一种方式。
玩得开心。
不隶属于 StackOverflow