2010-05-20 73 views
5

我有一個非常簡單的問題,我不應該掛在這個,但我是。哈哈!格式化下列字符串的最有效方法是什麼?

我有接收在以下格式(或多個)的字符串:

123456-D53

123455-4D

234234-4

想要的輸出格式是:

123-455-444

123-455-55

123-455-5

123-455

格式是最終取決於原始字符串中的字符總數..

我有seve ..

的如何做到這一點拉爾的想法,但我一直的事情還有比一個與string.replace更好的方式並連接...

感謝您的建議伊恩

+6

你肯定效率是最重要的指標這裏,而不是例如可讀性?你有沒有分析過,看看這是你程序中的瓶頸? – 2010-05-20 17:56:28

+1

兩個帳戶都沒有。事實上,我確信這不是瓶頸,效率不是最重要的指標。我只是好奇,一直在想這件事。 :) – 2010-05-20 17:58:24

回答

2

我認爲這不僅僅依賴於輸入始終是數字?如果是這樣,我喜歡這個

private string ApplyCustomFormat(string input) 
{ 
    StringBuilder builder = new StringBuilder(input.Replace("-", "")); 

    int index = 3; 
    while (index < builder.Length) 
    { 
     builder.Insert(index, "-"); 
     index += 4; 
    } 
    return builder.ToString(); 
} 
+0

這與我的實現類似..我剛剛被抓住了「這是最有效的方法嗎?」問題...... – 2010-05-20 18:09:56

+0

@I P - 「最有效率」不如「有效率」更重要。查看第一條評論。我會試着編寫使用IEnumerable chunker(method或Regex)和String.Join ;-)的「效率較低」代碼 – 2010-05-20 18:18:41

+0

選擇這一個作爲答案,因爲它首先根據我描述的規範工作。儘管其他海報更新了他們的代碼以便按需要工作。所有值得的綠色對號,但我只能給一個:) – 2010-05-24 04:19:18

2

編輯:見歷史舊版本。
您只能使用char.IsDigit()查找數字。

var output = new StringBuilder(); 
var digitCount = 0; 

foreach(var c in input) 
{ 
    if(char.IsDigit(c)) 
    { 
    output.Append(c); 
    digitCount++; 
    if(digitCount % 3 == 0) 
    { 
     output.Append("-"); 
    } 
    } 
} 

// Remove possible last - 
return output.ToString().TrimEnd('-'); 

此代碼應填寫由左到右(現在我知道了,先讀,然後代碼)...
對不起,我還是現在不能測試此權利。

+0

我即將澄清我原來的帖子,字符串可以是字母數字,不只是數字。 – 2010-05-20 18:02:01

+0

我認爲這會填滿錯誤方向的數字。可以這麼說,他希望它是左傾的。 – user7116 2010-05-20 18:04:43

+0

@Ian:我現在用char.IsDigit。 @sixlettervariables:你是對的,這使得它變得更加困難。 – tanascius 2010-05-20 18:22:27

4

Tanascius思考的事情是正確的,但我不能發表評論或給予好評,由於我缺乏代表的,但如果你要上的String.Format其他信息伊夫發現這很有幫助。 http://blog.stevex.net/string-formatting-in-csharp/

+0

偉大的聯繫,謝謝。 – 2010-05-20 18:07:42

+0

我應該讓你知道我刪除了我的答案:-)。 OP改變了這個問題,它不再適用。此外,sixlettervariable指出,它實際上也不回答原來的問題。 – 2010-05-20 18:30:12

0

不是最快的,但容易對眼睛(主編:讀取):

string Normalize(string value) 
{ 
    if (String.IsNullOrEmpty(value)) return value; 

    int appended = 0; 
    var builder = new StringBuilder(value.Length + value.Length/3); 
    for (int ii = 0; ii < value.Length; ++ii) 
    { 
     if (Char.IsLetterOrDigit(value[ii])) 
     { 
      builder.Append(value[ii]); 
      if ((++appended % 3) == 0) builder.Append('-'); 
     } 
    } 

    return builder.ToString().TrimEnd('-'); 
} 

用途猜測預先分配的StringBuilder的長度。這將接受用戶添加的任何垃圾量的任何字母數字輸入,包括多餘的空白。

+6

哈哈,我們必須有不同類型的眼睛:p – 2010-05-20 18:21:03

+0

你應該檢查'(ii + 1)%3 == 0'。 – 2010-05-20 18:30:45

+0

@ 0xA3:很好。 @pst:如果我回來讀這篇文章,很明顯會發生什麼。沒有混淆;) – user7116 2010-05-20 18:55:10

2

下面是一個方法,它使用正則表達式和LINQ的組合,一次提取三個字母組,然後再將它們連接在一起。注意:它假定輸入已經被驗證。驗證也可以用正則表達式來完成。

string s = "123456-D53"; 
string[] groups = Regex.Matches(s, @"\w{1,3}") 
         .Cast<Match>() 
         .Select(match => match.Value) 
         .ToArray(); 
string result = string.Join("-", groups); 

結果:

 
123-456-D53 
相關問題