Этот вопрос спрашивает то же самое, что я думаю. Как правило, принятый ответ, похоже, заключается в том, что вы либо делаете это в своей логике приложения (читайте в том, что у вас есть в массиве, затем перебираете массив и создаете отсутствующие даты), либо используете временные таблицы, заполненные датами, которые вы хотите присоединиться.
Я использовал ответ bniwredyc, чтобы получить Улучшенную версию моей рутины:
private void demo()
{
string cell = "ABCD4321";
int row, a = getIndexofNumber(cell);
string Numberpart = cell.Substring(a, cell.Length - a);
row = Convert.ToInt32(Numberpart);
string Stringpart = cell.Substring(0, a);
}
private int getIndexofNumber(string cell)
{
int indexofNum=-1;
foreach (char c in cell)
{
indexofNum++;
if (Char.IsDigit(c))
{
return indexofNum;
}
}
return indexofNum;
}
Регулярные выражения лучше всего подходят для такого рода работ:
using System.Text.RegularExpressions;
Regex re = new Regex(@"([a-zA-Z]+)(\d+)");
Match result = re.Match(input);
string alphaPart = result.Groups[1].Value;
string numberPart = result.Groups[2].Value;
Используйте Linq для этого
string str = "OS234";
var digits = from c in str
select c
where Char.IsDigit(c);
var alphas = from c in str
select c
where !Char.IsDigit(c);
Каждый и его мать дадут вам решение с использованием регекса, так что вот это не так:
// s is string of form ([A-Za-z])*([0-9])* ; char added
int index = s.IndexOfAny(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' });
string chars = s.Substring(0, index);
int num = Int32.Parse(s.Substring(index));
Вы делаете это в целях сортировки? Если да, то имейте в виду, что регекс может убить производительность для больших списков. Я часто использую AlphanumComparer
, который является общим решением этой проблемы (может обрабатывать любую последовательность букв и цифр в любом порядке). Я считаю, что адаптировал его из этой страницы.
Даже если вы не сортируете его по символам (если у вас есть переменные длины). или простая подстрока/разделение (если они исправлены) будет намного эффективнее и проще в тестировании, чем регекс.
..NET 2.0 совместимый, без регекса
public class Result
{
private string _StringPart;
public string StringPart
{
get { return _StringPart; }
}
private int _IntPart;
public int IntPart
{
get { return _IntPart; }
}
public Result(string stringPart, int intPart)
{
_StringPart = stringPart;
_IntPart = intPart;
}
}
class Program
{
public static Result GetResult(string source)
{
string stringPart = String.Empty;
int intPart;
var buffer = new StringBuilder();
foreach (char c in source)
{
if (Char.IsDigit(c))
{
if (stringPart == String.Empty)
{
stringPart = buffer.ToString();
buffer.Remove(0, buffer.Length);
}
}
buffer.Append(c);
}
if (!int.TryParse(buffer.ToString(), out intPart))
{
return null;
}
return new Result(stringPart, intPart);
}
static void Main(string[] args)
{
Result result = GetResult("OS234");
Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart);
result = GetResult("AA4230 ");
Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart);
result = GetResult("ABCD4321");
Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart);
Console.ReadKey();
}
}