2011-08-24 177 views
2

我試圖操縱字符串..提取數字從一個字符串

例如:

string DiagnosesString "250.00 03 350.0001 450.00 01 550.00 02"; 

輸出

250.00 
350.00 
450.00 
550.00 

我試着用拆分方法。正如你可以看到我的例子在350.0001和它的輸出是350.00。

我可以去掉03,02,等等。

問題:1。 )我如何將刪除的350.0001的01只得到350.00?

這裏是我的代碼:

string DiagnosisCodestemp = DiagnosesString.Replace(" 01 ", " ").Replace(" 02 ", " ").Replace(" 03 ", " ").Replace(" 04 ", " ").Replace(" 05 ", " ").Replace(" 06 ", " ").Replace(" 07 ", " "); 
string[] DiagnosisCodesParts = DiagnosisCodestemp.Split(); 
+0

你真正需要的是更具體的關於什麼的輸入可能是,你給的例子並沒有告訴我們很多。 – Jon

+0

您能否提供更多關於輸入字符串格式的詳細信息 - 例如,它是否始終是5位十進制(xxx.xx),後面是2位數(yy)? –

+1

另外,「350.0001」是否正確? 350.00到01之間沒有空間 - 這可能會讓生活變得艱難! –

回答

1

名單列表=新名單();

 string DiagnosesString = "250.00 03 350.0001 450.00 01 550.00 02"; 

     string DiagnosisCodestemp = DiagnosesString.Replace(" 01 ", " ").Replace(" 02 ", " ").Replace(" 03 ", " ").Replace(" 04 ", " ").Replace(" 05 ", " ").Replace(" 06 ", " ").Replace(" 07 ", " "); 

     string[] DiagnosisCodesParts = DiagnosisCodestemp.Split(); 

     foreach (var item in DiagnosisCodesParts) 

     { 

      string[] parts = item.Split('.'); 
      string num = parts[1]; 
      string finalValue = string.Empty; 

      if (num.Length > 2) 
      { 
       num = num.Replace(num, "00"); 
       finalValue = parts[0]+"."+num; 
      } 
      else 
      { 
       finalValue = parts[0] + "." + num; 
      } 

      list.Add(finalValue); 
     } 

O/P:250.00 350.00 450.00 550.00

+0

,如果你有一樣,如果輸入字符串爲250.01,那麼你需要,如果你想O/P爲250.00 – 62071072SP

+0

感謝,再寫條件的另一個條件.. –

+0

你是最歡迎的。並感謝您接受我的答案SilverFang – 62071072SP

3

如何做一個Decimal.TryParse和格式化的十進制數。這也將清除不良的價值觀。

string DiagnosesString = "250.00 03 350.0001 450.00 01 550.00 02"; 
var diagnoses = DiagnosesString.Split(' '); 
foreach(var diagnosis in diagnoses) 
{ 
    decimal temp; 
    if(diagnosis.Contains(".") && Decimal.TryParse(diagnosis, out temp)) 
    { 
    // do something 
    var value = temp.ToString("0.00"); 
    } 
} 
+0

它將如何刪除錯誤的條目; '03'會被'Decimal.Parse'正確解析嗎? – jason

+0

糟糕,我讀爲o3。我會解決它。 (更新:固定) – scottheckel

+0

只是一張紙條:你可以用'斯普利特(「‘)'或'斯普利特(’」,‘’,‘:’)' - 不需要創建新的數組。 – Reniuz

1

嘗試在空間上剔除。

string DiagnosisCodestemp = DiagnosesString.Replace(" 01 ", " ").Replace(" 02 ", " ").Replace(" 03 ", " ").Replace(" 04 ", " ").Replace(" 05 ", " ").Replace(" 06 ", " ").Replace(" 07 ", " "); 
string[] DiagnosisCodesParts = DiagnosisCodestemp.Split(' '); 

這應該會產生一個包含值的數組,您可以過濾出所需的數組。然後,您可以將值轉換爲十進制和四捨五入以刪除額外的值。

1

,你可以使用正則表達式

/\d+\.\d+/ 

中的編號不一致,但是這取決於你是否能更準確與否定義你的電話號碼。

decimal number; 
string DiagnosesString = "250.00 03 350.0001 450.00 01 550.00 02"; 

foreach(var num in Regex.Matches(DiagnosesString, @"\d+\.\d+")) 
{ 
    Decimal.TryParse(num.ToString(), out number); 
    Console.WriteLine(number.ToString("0.00")); 
} 

可能你甚至需要這樣的正則表達式:

/(\d+.\d\d)\d*/ 

,格式爲0.00只匹配數字...你應該爲你希望你的數據進行分析更多的數據..

5
var DiagnosisCodesParts = 
    DiagnosesString.Split(' ') 
        .Where(s => !s.StartsWith("0")) 
        .Select(s => Decimal.Parse(s)) 
        .Select(d => d.ToString("0.00"); 
+0

003.2901怎麼辦? –

+1

@SilverFang:那麼你應該在你的問題中指定這種可能性。對不起,但我們不能精確地解決你的問題,沒有一個確切的問題陳述。 – jason

+0

對不起有關 –

1

1)將字符串轉換爲十進制 2)輪小數2位小數 3)將其轉換回字符串

2

如果您正在處理數值,我會建議將它們解析爲實際的數字類型,例如使用Decimal.ParseDecimal.TryParse。然後您可以使用格式將其轉換回字符串,例如myNumber.ToString("N2")

2

您可以將它們解析爲雙精度。我喜歡用XmlConvert此:

foreach (var s in diagnosisCodesParts) 
{ 
    var d = XmlConvert.ToDouble(s); 
    Console.WriteLine(string.Format({0:2}, d)); 
} 
+0

爲什麼'XmlConvert'? XML解析不是固有的緩慢嗎?只是好奇.. – Yuck

+1

因爲XML定義瞭如何序列化雙打。每當我嘗試解析double時,我都會頭痛,因爲您需要正確設置NumberFormatProvider,否則可能會發生不好的事情。在輸入中看到那段時間?那是千分位還是小數點?但是,是的,您也可以爲'double.Parse'指定正確的格式選項。 –

+0

有趣,不知道。 +1 :) – Yuck

1

串DiagnosesString = 「03 250.00 450.00 350.0001 550.00 01 02」;

string DiagnosisCodestemp = DiagnosesString.Replace(「01」,「」).Replace(「02」,「」).Replace(「03」,「」).Replace(「04」,「」).Replace (「05」,「」)。替換(「06」,「」)。替換(「07」,「」);

 string[] DiagnosisCodesParts = DiagnosisCodestemp.Split(); 

     foreach (var item in DiagnosisCodesParts) 

     { 

      string[] parts = item.Split('.'); 
      string num = parts[1]; 
      if (num.Length > 2) 
      { 
       num = num.Replace(num, "00"); 
      } 

     } 
+0

如果輸入數字爲250.01?你的代碼給出的結果是250.00我對嗎? – Reniuz

+0

我din't檢查THT狀況仍給予01不是00,如果輸入的代碼是250.01 – 62071072SP

+0

哦對不起我的意思是250.011 – Reniuz

1

好吧,我不知道我完全理解你的問題,但我會嘗試。

  1. 拆分爲你做過的事情。
  2. 您濾波器/忽略具有2或更小的長度的所有字符串。
  3. 將數組中剩餘的字符串轉換爲double。
  4. 您在這些點後將這些值舍入爲2個數字。
1

您將需要將字符串轉換爲數值,我選擇小數點,因爲它不會像double或float那樣失去精度。然後你可以使用格式字符串說明將其轉換爲十進制形式,你想:

var list = List<string>(); 
foreach(var s in splitString) { 

    // code to rule out 02, 01, etc. goes here 

    decimal tmp; 
    if (decimal.TryParse(s, out tmp)) { 
    var code = tmp.ToString("0.00"); 
    list.Add(code); 
    } else { 
    // something went wrong, handle it here 
    } 
} 
1
using System; 
using System.Text.RegularExpressions; 
class Program 
{ 
    static void Main() 
    { 
     string input = "250.00 03 350.0001 450.00 01 550.00 02"; 
     Match match = Regex.Match(input, @"[0-9]+[/.][0-9]+", RegexOptions.IgnoreCase); 
     while (match.Success) 
     { 
      string key = match.Value; 
      Console.WriteLine(String.Format("{0:0.00}", Convert.ToDecimal(key, new CultureInfo("en-US")))); 
      match = match.NextMatch(); 
     } 
    } 
} 
+0

這是一個有點小問題,匹配值。 – scottheckel

+0

不止一點點關閉,對於這個爛攤子抱歉......已經被清理和測試。 –