2011-04-28 2 views
1

정규 표현식에별로 좋지 않아 숫자 서식 지정에 사용하려고합니다.C# Regex Number Formatting

원래 번호는 05XX-123과 같을 것이고 0을 추가하여 05XX-000123으로 만들 수 있습니다 (하이픈 다음의 숫자는 길이가 6이 될 때까지 0이 붙어야합니다). 내가 정규식 문자열 연산을 혼합하면 난 내가 런타임에 정의 할 수 있도록 이러한 변환을하고자하기 때문에 세 번째 줄을 피하기 위해 같은 것 ... 그러나, 다음과 같은 솔루션을

Regex regex = Regex(@"^([0-9]{2})([A-Za-z]{2})-([0-9]*)$"); 
Match match = regex.Match("05XX-123"); 
string result = match.Groups[1].Value + match.Groups[2].Value + "-" + match.Groups[3].Value.PadLeft(6, '0'); 

을이 작업을 수행 할 수 있습니다.

이게 가능해야하는 것과 비슷하지만, 세 번째 그룹 (글자 뒤의 숫자)에 0을 어떻게 추가하는지 잘 모르겠습니다.

Regex regex = Regex(@"^([0-9]{2})([A-Za-z]{2})-([0-9]*)$"); 
string result = regex.Replace("05XX-123", "$1$2-$3"); 

은 물론 위의 예는 제공된와 같은 값을 반환하지만 $ 3의 길이 여섯 확인하기 위해 0을 앞에 추가 할 수있는 $ 3 그룹으로 뭔가를 할 수있을 것처럼 보인다.

도움을 주시면 감사하겠습니다. (당신이 뭔가 다른 정규식이 필요하지 않은 경우)

답변

4

이 시도 :

string[] parts = originalNumber.Split(new char[] {'-'}); 
string newNumber = parts[0] + "-" + parts[1].PadLeft(6, '0'); 

편집 :

다른 정규식 대안 : 내가 원하는 있지만

Regex regEx = new Regex(@"^([0-9]{2}[A-Z]{2}\-)([0-9]*)$", RegexOptions.IgnoreCase); 
string result = regEx.Replace("05XX-123",m => m.Groups[1].Value + m.Groups[2].Value.PadLeft(6, '0')); 
+0

이 작품 문자열 연산을 완전히 피할 수 있습니다. 그 이유는 런타임에 변환이 정의되기를 바랍니다. – majorpayne27

+0

@ majorpayne27 : 런타임시 정규식 패턴을 생성하는 것이 문자열 함수의 매개 변수를 변경하는 것보다 훨씬 쉽습니다. IMO – Dyppl

+0

문자열 함수를 사용하는 것이 확실히 쉬울 것이지만 사용 가능한 옵션이 아닙니다. 다시 컴파일하지 않고 출력 형식을 변경할 수 있어야합니다. – majorpayne27