16

我有一个从导入文件中提取的压缩字符串值。我需要把它格式化成一个包裹号,格式如下:##-##-##-###-###. 因此,字符串“410151000640”应该变成“41-01-51-000-640”。我可以使用以下代码执行此操作:

String.Format("{0:##-##-##-###-###}", Convert.ToInt64("410151000640"));

但是,字符串可能不是全是数字;它可能有一个或两个字母,因此转换为 int 将失败。有没有办法在字符串上执行此操作,以便每个字符(无论是数字还是字母)都正确地适合格式?

4

6 回答 6

37
Regex.Replace("410151000640", @"^(.{2})(.{2})(.{2})(.{3})(.{3})$", "$1-$2-$3-$4-$5");

或稍短的版本

Regex.Replace("410151000640", @"^(..)(..)(..)(...)(...)$", "$1-$2-$3-$4-$5");
于 2010-10-19T13:36:15.360 回答
11

只要您知道“包裹编号”始终符合特定规则,我就会通过您自己的格式化方法来解决这个问题。

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));
}
于 2010-10-19T13:39:39.143 回答
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, "-");
}
于 2010-10-19T13:33:59.850 回答
2

如果它是 UI 的一部分,您可以MaskedTextProvider使用System.ComponentModel

    MaskedTextProvider prov = new MaskedTextProvider("aa-aa-aa-aaa-aaa");
    prov.Set("41x151000a40");
    string result = prov.ToDisplayString();
于 2010-10-19T14:04:47.950 回答
1

这是一个带有一些实用程序的简单扩展方法:

    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);

您可以将它与任何字符串一起使用,并且将插入掩码中除 # 之外的任何字符。面具将从右到左工作。如果需要,您可以将其调整为另一种方式。

玩得开心。

于 2018-07-27T17:40:23.077 回答
0

如果我理解正确,您正在寻找一个从字符串中删除所有字母的函数,不是吗?

我是动态创建的,如果你正在寻找它,也许你可以将它转换成 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
于 2010-10-19T13:45:55.590 回答