如何在VB.NET中每2个数字向数字字符串添加空格?

时间:2011-10-21 22:58:34

标签: .net vb.net

结论:我使用了一个正则表达式,它在一行代码中处理任意长度的字符串中的数字和字母。

       dim rtn as String = Regex.Replace(input, "..", "$& ")

我想取任意长度的 numeric 字符串,每2个字符插入一个空格。 因此1233456变为12 33 45 6。

有没有办法可以将格式用作字符串或IFormatProvider,比如?这会限制字符串的长度,对吧?因为我要投入很长时间。

        CLng((input)).ToString("## ")

编辑 - 这是原始问题。 我想取任意长度的字符串并每2个字符插入一个空格。 123dssas4rr应该变为12 3d ss为4r r

我笨拙地使用

    Dim rtn As String = String.Empty

    Dim i As Integer = 0
    For Each a In input.ToCharArray
        rtn = String.Concat(rtn, a)
        i = i + 1
        If i Mod 2 = 0 Then
            rtn = String.Concat(rtn, " ")
        End If
    Next

4 个答案:

答案 0 :(得分:5)

string rtn = Regex.Replace(input, "..(?=.)", "$& ");

或在VB中

dim rtn as String = Regex.Replace(input, "..(?=.)", "$& ")

您需要导入System.Text.RegularExpressions(或在Regex之前添加命名空间名称。

如果您愿意在替换后Trim字符串,那么您可以完全摆脱括号(及其中的内容)。但是,您需要一个或另一个,因此具有偶数个字符的字符串最后没有额外的空格。

答案 1 :(得分:4)

也许不是最漂亮的,但简单快速的方法是普通的旧StringBuilder:

Const charNumber = 2
Dim oldString = "123dssas4rr"
Dim sb As New System.Text.StringBuilder()
For i As Integer = 0 To input.Length - 1
    If i Mod charNumber = 0 Then
        sb.Append(" "c)
    End If
    sb.Append(input(i))
Next
Dim newString = sb.ToString()

修改

将StringBuilder与Regex方法进行比较只是为了感兴趣:

Dim timer As New Stopwatch
Dim regexTime As TimeSpan, stringBuilderTime As TimeSpan
Dim input As String = "123dssas4rr"
Dim result As String

timer.Start()
For i As Int32 = 1 To 10000000
    result = Regex.Replace(input, "..(?=.)", "$& ")
Next
timer.Stop()
regexTime = timer.Elapsed

timer.Restart()
Const charNumber = 2
For i As Int32 = 1 To 10000000
    Dim sb As New System.Text.StringBuilder()
    For chr As Integer = 0 To input.Length - 1
        If chr Mod charNumber = 0 Then
            sb.Append(" "c)
        End If
        sb.Append(input(chr))
    Next
    result = sb.ToString()
Next
timer.Stop()
stringBuilderTime = timer.Elapsed

结果

Regex:           00:00:40.8928958
StringBuilder:   00:00:03.3468080

StringBuilder在1000万次迭代中的速度提高了12倍,即使它在每次迭代时都会创建一个新的StringBuilder对象。差异将越大,字符串越长。有时候更短的解决方案并不快,同样适用于LINQ方法。

即使这个测试实际上并不重要,如果我将其更改为从具有500.000个字符(500kb)的文件中读取字符串并迭代100次,那么StringBuilder的结果会更好:

Regex:           00:00:15.8409331
StringBuilder:   00:00:00.8262289

StringBuilder方法快了近20倍。

这是一个扩展版本:

Public Module StringExtensions
    <Runtime.CompilerServices.Extension()>
    Public Function InsertStringRepeatedly(ByVal input As String, ByVal separator As String, ByVal length As Int32) As String
        Dim sb As New System.Text.StringBuilder()
        For chr As Integer = 0 To input.Length - 1
            If chr Mod length = 0 Then
                sb.Append(separator)
            End If
            sb.Append(input(chr))
        Next
        Return sb.ToString()
    End Function
End Module

您可以通过以下方式调用它:

Dim result = input.InsertStringRepeatedly(" ", 2)

答案 2 :(得分:2)

我会给你算法和代码,好吗?

  1. 获取字符串的长度;
  2. 通过字符串
  3. 使用for循环
  4. 在每个循环操作中,将当前循环字符添加到新的临时字符串
  5. 每当获得偶数值时,请为临时字符串添加空格
  6. 瞧!

答案 3 :(得分:0)

你可以做一些像这个简单的事情

Dim newString AS Char() = oldString.ToCharArray()

For i = 0 To i = oldString.Length - 1
   If i Mod 2 = 0 Then Array.Add(newString, " ")
   Array.Add(newString, oldString(i))

Next

String.Join(newString, "")