簡體   English   中英

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

[英]How do I add spaces to a numeric string every 2 numbers in VB.NET?

結論:我使用了一個正則表達式,它在一行代碼中處理任意長度的字符串中的數字和字母。

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

我想取任意長度的數字字符串,每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
string rtn = Regex.Replace(input, "..(?=.)", "$& ");

或者在VB中

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

您需要導入System.Text.RegularExpressions (或在Regex之前添加命名空間名稱)。

如果你願意在替換之后Trim字符串,那么你可以完全擺脫括號(以及它們內部的東西)。 但是,您需要一個或另一個,因此具有偶數個字符的字符串最后沒有額外的空格。

也許不是最漂亮的,但簡單快速的方法是普通的舊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)

我會給你算法和你的代碼,好嗎?

  1. 獲得字符串的長度;
  2. 在字符串中使用for循環
  3. 在每個循環操作中,將當前循環字符添加到新的臨時字符串
  4. 只要獲得偶數值,就可以為臨時字符串添加空格

瞧!

你可以做一些簡單的事情

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, "")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM