2011-08-24 176 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

不止一点点关闭,对于这个烂摊子抱歉......已经被清理和测试。 –