2011-08-24 4 views
2

Я пытаюсь манипулировать строку ..Извлечение чисел из строки

Например:

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

Выходные

250.00 
350.00 
450.00 
550.00 

Я пытался использовать Split метод. Как вы можете видеть на моем примере в 350.0001, а его выход - 350.00.

Я удален 03, 02 и т.д ..

Вопрос: 1.) Как я удалил o1 из 350.0001 получить только 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

список List = новый список();

 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); 
     } 

о/р: 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

просто примечание: вы можете использовать 'Split ('')' или 'Split ('', ';', ':')' - не нужно создавать новый массив. – Reniuz

1

Попробуйте aplitting на пространстве.

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

Это должно производить массив со значениями, и вы можете фильтровать те, которые вам нужны. Затем вы можете преобразовать значения в десятичные и округлые в 2 места, чтобы удалить дополнительные значения.

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.Parse или Decimal.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 определяет, как сериализовать парные. У меня возникают головные боли, когда я пытаюсь разобрать двойной, так как вам нужно правильно установить NumberFormatProvider, иначе могут случиться плохие вещи. Посмотрите этот период на входе? Это разделитель тысяч или десятичная точка? Но да, вы также можете указать правильные параметры форматирования для 'double.Parse'. –

+0

Интересно, не знал этого. +1 :) – Yuck

1

строка DiagnosesString = "03 350,0001 250,00 450,00 01 550,00 02";

Строка ДиагностикаCodestemp = ДиагностикаString.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

Я не проверю условие, которое он все еще дает 01, не 00, если код ввода 250.01 – 62071072SP

+0

о, жаль, что я имею в виду 250.011 – Reniuz

1

Хорошо, я не уверен, что полностью понял ваш вопрос, но я попробую.

  1. Вы раскалываете, как и раньше.
  2. Вы фильтруете/игнорируете все строки длиной 2 или менее.
  3. Вы преобразовываете строки, оставшиеся в вашем массиве, в два раза.
  4. Вы обходите эти значения до двух чисел после точки.
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

Было больше, чем немного, извините за беспорядок ... были очищены и протестированы. –

Смежные вопросы