C# 从字符串中提取数字

C# 从字符串中提取数字,c#,.net,string,split,C#,.net,String,Split,我在试着操纵一个字符串 例如: 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的o1仅获取350.00 这是我的密码: string DiagnosisCodestemp = DiagnosesStr

我在试着操纵一个字符串

例如:

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的o1仅获取350.00

这是我的密码:

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

做一个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");
  }
}

试着适应这个空间

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

这将生成一个包含值的数组,您可以筛选所需的值。然后,您可以将值转换为十进制,并将其四舍五入为2位,以删除多余的值。

您可以使用正则表达式匹配数字

/\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的数字。。。您应该提供更多数据,以了解如何解析数据。

1)将字符串转换为十进制
var DiagnosisCodesParts =
    DiagnosesString.Split(' ')
                   .Where(s => !s.StartsWith("0"))
                   .Select(s => Decimal.Parse(s))
                   .Select(d => d.ToString("0.00");
2) 将小数点四舍五入至小数点后2位
3) 将其转换回字符串

如果您处理的是数值,我建议将它们解析为实际的数值类型,例如使用
Decimal.Parse
Decimal.TryParse
。然后,您可以使用格式将其转换回字符串,例如,
myNumber.ToString(“N2”)
您可以将其解析为双精度字符串。我喜欢为此使用
XmlConvert

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

字符串诊断字符串=“250.00 03 350.0001 450.00 01 550.00 02”

string diagnosisdestemp=diagnosisstring.Replace(“01”和“)。Replace(“02”和“)。Replace(“03”和“)。Replace(“04”和“)。Replace(“05”和“)。Replace(“06”和“)。Replace(“07”和“)


好的,我不确定我是否完全理解你的问题,但我会试试看

  • 你像以前一样分手了
  • 过滤/忽略长度为2或更少的所有字符串
  • 将数组中剩余的字符串转换为double
  • 将这些值四舍五入为点后的2个数字

  • 您需要将字符串转换为数值,我选择decimal,因为它不会像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
      }
    }
    
    var list=list();
    foreach(splitString中的变量s){
    //排除02、01等的代码在这里
    十进制tmp;
    if(十进制锥巴色,输出tmp)){
    var代码=tmp.ToString(“0.00”);
    列表。添加(代码);
    }否则{
    //出了点问题,在这里处理
    }
    }
    
    列表=新列表()


    o/p:250.00 350.00 450.00 550.00

    您确实需要更具体地说明输入可能是什么,您给出的示例并不能告诉我们太多。您能否提供输入字符串格式的更多详细信息?例如,输入字符串是否始终是5位小数(xxx.xx)后跟2位数字(yy)?还有,“350.0001”对的350.00和01之间没有空间-这可能会让生活变得艰难!很简单,350.0001-0.0001=350.00:PBecause XML定义了如何序列化双精度。每当我试图解析double时,我都会感到头疼,因为您需要正确设置NumberFormatProvider,否则可能会发生不好的事情。看到输入中的那个句号了吗?那是千位分隔符还是小数点?但是是的,您也可以为
    double.Parse
    指定正确的格式选项。有趣的是,我不知道这一点+1:)如何删除不良条目
    03将通过
    十进制正确解析。解析
    ?只需注意:您可以使用
    Split(“”)
    Split(“”,“;”,:”)
    -不需要创建新数组。如果输入有数字250.01?你的代码给出的结果是250.00,对吗?我没有检查tht条件,如果输入代码是250.01,它仍然给出01而不是00。如果你有另一个条件,比如输入字符串是250.01,那么你需要写另一个条件,如果你希望o/p为250.00,你是最受欢迎的。感谢您接受我的回答。如果任何项目不包含。如果任何项目不包含“”,则将引发异常。您的意思是“ok”,那么我们可以编写条件,我们可以检查是否(项目。包含(“.”),然后它将进入循环,或者在其他部分我们可以编写列表。添加(项目)@SilverFang:那么你应该在你的问题中指定这种可能性。对不起,如果没有一个精确的问题陈述,我们无法精确地解决你的问题。也许只检查一个小数点就可以输入,而不是一个以开始?这与匹配值有点不匹配。是不是有点不匹配,很抱歉混乱…已经清理了一个nd测试。
    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
      }
    }
    
    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();
            }
        }
    }
    
           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);
            }