2016-05-10 3 views
3

Я использовал C#, и я хотел бы, чтобы разделительный текст состоял из 3 двухместных номеров, разделенных запятыми и пробелами.разделите строку на три удвоения

я сделал:

double[] doubles = mystr.Trim().Split(new char[] { ' ', ',' }) 
       .Select(s => Convert.ToDouble(s)) 
       .ToArray(); 

, когда mystr = 33,44,55, например, он работает отлично (номер разделенный только одной запятой)

Кроме того, когда mystr = 33 44 55 для примера работает тонкий (номер разделенного только в одном пространства)

НО, когда mystr = 33, 44, 55 не работает (один пробел после запятой между каждыми двумя числами)

она также делает не работает, когда mystr = 33 44 55 (два пробела между двумя номерами)

В обоих примерах я получил необработанное исключение.

Как его решить?

Спасибо!

+0

'Regex.Replace (yourstring.Text," "," ");' – FiN

+0

Остерегайтесь, если двойник поступает из системы, которая является десятичным разделителем, является запятой, она будет терпеть неудачу, если она не будет записана с помощью System.Globalization.CultureInfo.InvariantCulture. – Gusman

ответ

0

Просто попробуйте указать StringSplitOptions и использовать StringSplitOptions.RemoveEmptyEntries для удаления пустых строк ..

double[] doubles = mystr.Trim().Split(new char[] { ' ', ',' },StringSplitOptions.RemoveEmptyEntries) 
      .Select(Convert.ToDouble) 
      .ToArray(); 
+1

@Programmer - Я хочу отметить, что ответ Джонатана Наппея должен быть принят со всей справедливостью, поскольку он в значительной степени идентичен этому ответу и был опубликован * до того, как этот ответ был (если вы наведете курсор на «ответил X часов назад» –

10

Вы можете добавить опцию, чтобы удалить пустые записи в Сплите:

var array = Array.ConvertAll(mystr.Split(new [] { ' ', ',' }, 
          StringSplitOptions.RemoveEmptyEntries), 
          Convert.ToDouble); 
+0

для использования 'Array.ConvertAll()' +1 – fubo

1

Вы можете использовать System.Text.RegularExpressions.Regex:

var pattern = @"(\d+)((,\s*|\s+)|$)"; 
const int RegexTimeoutSeconds = 1; 
var matches = Regex.Matches(mystr, pattern, RegexOptions.None, TimeSpan.FromSeconds(RegexTimeoutSeconds)); 
var doubles = new List<double>(); 

foreach (Match match in matches) 
{ 
    var group = match.Groups[1]; 
    var d = Convert.ToDouble(group.Value); 
    doubles.Add(d); 
} 
+2

Это регулярное выражение будет работать только в том случае, если есть хотя бы одна запятая и одно место. Первый пример «33,44,55» не удастся. Я думаю, вы, вероятно, "[,] +" 'для строки Regex. –

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