2011-07-27 6 views
5

Chciałbym dodać pewną liczbę wiodących zer do liczby w ciągu znaków. Na przykład:W języku C#, jak mogę użyć Regex.Replace, aby dodać wiodące zera (jeśli to możliwe)?

wejściowe: "strona 1", Wyjście: "strona 001" wejściowe: "Strona 12", Ouput: "strona 012" wejściowe: "strona 123", Ouput: "strona 123"

Jaki jest najlepszy sposób, aby to zrobić z Regex.Replace?

W tej chwili używam tego, ale wyniki są 001, 0012, 00123.

string sInput = "page 1"; 
sInput = Regex.Replace(sInput,@"\d+",@"00$&"); 
+0

Podobne pytanie: http://stackoverflow.com/questions/2659058/using-regex -to-add-leading-zeroes –

+1

Widziałem to, ale to nie jest podobne do mnie. Próbuję to zrobić z C# i Regex.Replace tylko jeśli to możliwe. –

Odpowiedz

11

Regex wyrażeń zamienne nie mogą być wykorzystywane do tego celu. Jednak Regex.Replace ma przeciążenie, które wymaga delegata, umożliwiającego niestandardowe przetwarzanie zamiennika. W tym przypadku szukam wszystkich wartości numerycznych i zastępuję je tymi samymi wartościami, które są dopełniane do długości trzech znaków.

string input = "Page 1"; 
string result = Regex.Replace(input, @"\d+", m => m.Value.PadLeft(3, '0')); 

Na stronie, nie polecam używania węgierskich przedrostków w kodzie C#. Nie oferują one żadnych rzeczywistych zalet, a wspólne przewodniki po .Net nie zalecają ich używania.

+0

"Węgierskie prefiksy w kodzie C#" - Powiedz to mojemu szefowi ... –

+0

@ebyrob: może pokaż [ten dokument] (http://msdn.microsoft.com/en-us/library/ms229045%28v= vs.100% 29.aspx) do swojego szefa. Jest to oficjalna dokumentacja firmy Microsoft, w której czytamy "Nie używaj węgierskiej notacji, a notacja węgierska jest praktyką włączania prefiksu w identyfikatorach w celu zakodowania niektórych metadanych dotyczących parametru, takich jak typ danych identyfikatora". Jeśli on cię nie słucha, może posłucha twórców narzędzia, z którego korzystasz? :) –

+0

@PawelKrakowiak został tam zrobiony to ... (Do jego uznania jesteśmy w mieszanym środowisku, ale wciąż.) To było najbardziej, co mogłem zrobić, aby go trochę wykształcić na systemach vs aplikacjach węgierskich. –

2
var result = Regex.Replace(sInput, @"\d+", m => int.Parse(m.Value).ToString("00#")); 
+0

Chociaż prawdopodobnie nie jest to problem w tym konkretnym przypadku, kod ten może być niebezpieczny, jeśli zostanie zgłoszony wyjątek, jeśli wejściowy ciąg znaków zawiera sekwencję cyfr o wartości większej niż "Int32.MaxValue". – Sven

+0

@Sven, W kontekście stron uważam, że jest to wątpliwe stwierdzenie :-) –

+1

Dlatego właśnie powiedziałem, że nie sądzę, że jest to problem w tym przypadku. Po prostu wskazuję to na wypadek, gdyby ktoś w przyszłości zobaczył ten kod i chciał go użyć do czegoś innego. :) – Sven

4

Użyj oddzwaniania na wymianę oraz metodę pad String.PadLeft cyfry:

string input = "page 1"; 
input = Regex.Replace(input, @"\d+", m => m.Value.PadLeft(3, '0')); 
+0

Podobna odpowiedź istnieje. –

+0

@Kirill Polishchuk: Tak, i wszystkie są albo publikowane albo edytowane po moim. – Guffa

0
string sInput = "page 1 followed by page 12 and finally page 123"; 

string sOutput = Regex.Replace(sInput, "[0-9]{1,2}", m => int.Parse(m.Value).ToString("000")); 
0
string sInput = "page 1"; 
//sInput = Regex.Replace(sInput, @"\d+", @"00$&"); 
string result = Regex.Replace(sInput, @"\d+", me => 
{ 
    return int.Parse(me.Value).ToString("000"); 
}); 
Powiązane problemy