2013-03-07 15 views
6

Mam ciąg znaków, który muszę zwiększyć o 1 Ciąg zawiera zarówno znaki, jak i wartości numeryczne.Zwiększ ciąg znaków z literami i liczbami

Układ łańcuch mam jest następujący „MD00494”

jak bym zwiększyć to do „MD00496” & „MD00497” ect

Gdyby to był normalny ciąg z numerami chciałbym analizować je int.

Próbowałem następujące

int i = int.Parse(sdesptchNo); 
i++; 
txtDispatchNo.Text = i.ToString(); 

ktoś jakieś pomysły jak pójdę na ten temat.

+0

Czy "D" w "MD00497" ostatecznie stanie się "E"? – Mohayemin

+0

Żadne D nie pozostanie zawsze w miejscu, w którym nie będzie tak duże, gdzie muszę przejść obok 3000 – Inkey

+1

@Inkey: Nie ma znaczenia, że ​​nie będziesz musiał przechodzić przez 3000. Ty ** musisz ** określić, co się stanie jeśli przejdziesz obok 99999, chyba że podoba Ci się kod, który może potencjalnie ujawnić nieznane zachowanie. – Jon

Odpowiedz

12

Najpierw powinieneś wymyślić jakiekolwiek podobieństwo między ciągami. Jeśli na końcu zawsze znajduje się przedrostek liter, za którym następują cyfry (o stałej szerokości), możesz po prostu usunąć litery, przeanalizować resztę, zwiększyć i ponownie je złączyć.

E.g. w twoim przypadku można użyć coś tak:

var prefix = Regex.Match(sdesptchNo, "^\\D+").Value; 
var number = Regex.Replace(sdesptchNo, "^\\D+", ""); 
var i = int.Parse(number) + 1; 
var newString = prefix + i.ToString(new string('0', number.Length)); 

Innym rozwiązaniem, które może być trochę bardziej wytrzymałe może być

var newString = Regex.Replace(x, "\\d+", 
    m => (int.Parse(m.Value) + 1).ToString(new string('0', m.Value.Length))); 

To byłoby zastąpić dowolną liczbę w ciągu przez zwiększany numer w tej samej szerokości - ale pozostawia każdy numer niepoliczalny dokładnie taki sam i w tym samym miejscu.

2

Musisz znaleźć pozycję pierwszej cyfry w ciągu znaków. Następnie podziel łańcuch na 2 pola.

MD 0 0 4 9 4

Pierwsze pole będzie niż część numerycznych "MD" Drugie pole będzie częścią numerycznej "00494"

zwiększamy numeryczny tylko część z „00495”

stracisz początkowego zera, tak będziesz musiał pad nowy numer z tej samej ilości jak już zwiększany zera.

Następnie dołącz do 2 pól.

+1

Szukałbym pozycji ostatniej nie cyfry w ciągu, a nie pierwszej cyfry, na wypadek, gdyby był ciągiem typu '' Foo37Baz0"'. –

3

Zakładając, że potrzebna jest tylko inkrementacja numerycznej części napisu i że struktura łańcuchów jest zawsze - grupa nieliczbowych znaków, po których następuje spora liczba cyfr, można użyć wyrażenia regularnego do rozbicia łańcuch na te dwa komponenty, zamień część liczbową na liczbę całkowitą, zwiększ ją, a następnie połącz ponownie.

var match = Regex.Match("MD123", @"^([^0-9]+)([0-9]+)$"); 
var num = int.Parse(match.Groups[2].Value); 

var after = match.Groups[1].Value + (num + 1); 
0

Można użyć regex:

int kod = int.Parse(Regex.Replace(sdesptchNo, "[^0-9]", "")) + 1; 

string zeroStr=Regex.Replace(sdesptchNo, "[^0-9]", ""); 
string newZeroStr=""; 
for (int x=0;x<zeroStr.length;x++) 
    if (zeroStr[x]=='0') newZeroStr=newZeroStr+"0"; 
    else break; 

string newVal=Regex.Replace(sdesptchNo, "[0-9]", "") + newZeroStr + kod; 

AKTUALIZACJA: Pozwoli to zaoszczędzić swój zerowy

+0

Spowoduje to utratę początkowych zer. – juharr

2

Oto jeden dla Regex sposób: P

string str = "MD00494"; 
string digits = new string(str.Where(char.IsDigit).ToArray()); 
string letters = new string(str.Where(char.IsLetter).ToArray()); 

int number; 
if (!int.TryParse(digits, out number)) //int.Parse would do the job since only digits are selected 
{ 
    Console.WriteLine("Something weired happened"); 
} 

string newStr = letters + (++number).ToString("D5"); 

wyjście byłoby:

newStr = "MD00495" 
0

Oto moje rozwiązanie:

string str = Console.ReadLine(); 
string digits = new string(str.Where(char.IsDigit).ToArray()); 
string letters = new string(str.Where(char.IsLetter).ToArray()); 
string newStr; 
int number; 

if (!int.TryParse(digits, out number)) 
{ 
    Console.WriteLine("Something weird happened"); 
} 
if (digits.StartsWith("0")) 
{ 
    newStr = letters + (++number).ToString("D5"); 
} 
else 
{ 
    newStr = letters + (++number).ToString(); 
} 

Spróbuj!

0
string sDispatchNo = "MS00914"; 
var pattern = @"^[a-zA-Z]+"; 
var strPart = Regex.Match(sDispatchNo, pattern).Value; 
var noPart = Regex.Replace(sDispatchNo, pattern, ""); 
var no = int.Parse(noPart); 
var length = noPart.Length; 
length = (no + 1)/(Math.Pow(10,length)) == 1 ? length + 1 : length; 
var output = strPart + (no + 1).ToString("D" + length); 
+0

To jest bardzo ogólny, który może być używany dla dowolnej dużej liczby. Kroki: 1. Zidentyfikuj część String 2. Wskaż część numeru i jej długość 3. Numer inkrementacji 4 Ciąg łączący i numer – kaushal

Powiązane problemy