2015-11-24 3 views
2

У меня есть строка, как это: 99 365 25,633 gghddhdf 35Преобразовать строку с запятыми, чтобы удвоить

Мне нужно все числа в массиве. Моя проблема заключается в том, как обрабатывать 25,633 из-за ','. Как я могу получить этот номер? Мой код:

public string campDiff(string lineStr1, string lineStr2) 
{ 
    int size; 
    string sum = null; 
    double num1; 
    double num2; 
    double number; 

    string[] lineArr1 = lineStr1.Split(' '); ; 
    string[] lineArr2 = lineStr2.Split(' '); 

    if (lineArr1.Length > lineArr2.Length) 
    { 
     size = lineArr1.Length; 
    } 
    else 
    { 
     size = lineArr2.Length; 
    } 

    for (int i = 0; i < size; i++) 
    { 

     if (Double.TryParse(lineArr1[i], out num1)) 
     { 


      if (Double.TryParse(lineArr2[i], out num2)) 
      { 

       number = num2 - num1; 
       if (number > 0) 
       { 
        sum = Convert.ToString(number); 
        return sum; 
       } 
      } 
     } 
    } 
    return sum; 
} 

Но он пропускает число с запятыми.

+0

Я полагаю, это начинается с String.Split на символ пробела? – Nyerguds

+0

да это arry of lineArr1 и 2 – Tzahi

+2

Пожалуйста, покажите весь соответствующий код, т. Е. Где вы создаете 'lineArr' – TheLethalCoder

ответ

2

Есть много возможных решений. Хотя, самое лучшее, я думаю, это установить CultureInfo в Invariant, а затем заменить все запятые на точки. Например:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; 
string number = "3,2"; 
double d = double.Parse(number.Replace(",", ".")); 
Console.WriteLine(d); 

В своем коде, что будет сделано так:

double[] numbers1 = 
     lineStr1.Replace(",", ".") 
        .Split(new char[0], StringSplitOptions.RemoveEmptyEntries) 
        .Select(s => 
        { 
         double value; 
         bool success = double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out value); 

         return new { value, success }; 
        }) 
        .Where(p => p.success) 
        .Select(p => p.value) 
        .ToArray(); 

    double[] numbers2 = 
     lineStr2.Replace(",", ".") 
        .Split(new char[0], StringSplitOptions.RemoveEmptyEntries) 
        .Select(s => 
        { 
         double value; 
         bool success = double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out value); 

         return new { value, success }; 
        }) 
        .Where(p => p.success) 
        .Select(p => p.value) 
        .ToArray(); 

Теперь у вас есть два массива numbers1 и numbers2 со всеми возможными числами, выделенных из двух строк lineStr1 и lineStr2. Вы решаете, что с ними делать, поскольку я не могу полностью понять цель вашего метода.

(Спасибо всем ребятам в комментариях для заставляя меня изменить свой ответ.)

+1

Я бы предложил 'number.Replace (". "," ") .Replace (", ",". ")' Хотя ... просто чтобы быть уверенным! – CompuChip

+1

И я бы также передал 'CultureInfo.InvariantCulture' в' TryParse', а не изменил локаль текущего потока. Позднее это может вызвать неприятные сюрпризы. – CompuChip

+0

также возможно, что 'lineArr [i]' генерирует исключение. потому что счетчик увеличивается до размера большего массива. –

0

Просто проверьте, не текущая ли строкаArrX IsLetter или нет, перед выполнением операции.

public class IsLetterSample { 
public static void Main() { 
    char ch = '8'; 

    Console.WriteLine(Char.IsLetter(ch));     // False 
    Console.WriteLine(Char.IsLetter("sample string", 7)); // True 
} 
1

Я предполагаю, что у вас есть только одна строка, которая содержит , в строке, то вы можете разделить вашу строку с пробелами, получить элемент содержит этот символ, а затем разобрать его double с культурой, которая имеет , как NumberDecimalSeparator нравится (tr-TR).

var str = "99 365 25,633 gghddhdf 35"; 
var element = str.Split(' ').Where(s => s.Contains(',')).ToArray()[0]; 

double d = double.Parse(element, CultureInfo.GetCultureInfo("tr-TR")); 

Я использовал tr-TR, потому что это моя нынешняя культура. Вы можете Clone ваш CurrentCulture и установите его NumberDecimalSeparator собственности на ,, если нет.

0

Вы можете Regex строки первой

Regex.Replace(input, "[^0-9]+", string.Empty); 
Смежные вопросы