대상 인수 유형에 대해 C#의 복합 형식 문자열을 어떻게 검증합니까?
-
22-08-2019 - |
문제
사용자가 제공하는 복합 형식 문자열이 주어졌습니다 ( String.Format
) 및 복합 형식 문자열을 형식화하는 데 사용되는 인수를 나타내는 일련의 유형 세트는 사용자가 제공 한 값이 유효한지 어떻게 확인할 수 있습니까?
인수 자리 표시 자의 일반적인 구문이 일치하는지 확인하기 위해 정기적 인 표현을 만드는 것은 매우 쉬워야합니다. "{index[,alignment][:formatString]}
"당 문서. 복합 형식 문자열의 자리 표시 자의 인덱스가 실제 타이핑 된 인수 수보다 작다는 것을 확인하는 것은 그리 어렵지 않습니다 (즉, 주어지지 않는 인수를 참조하지 않습니다). 그러나 전달 될 인수에 대한 유형을 감안할 때 알려져 있으므로:formatString
"이러한 유형에 적합합니다.
예를 들어, 사용자를 확인하지 않으려 고합니다.{0:dddd MMMM}
"첫 번째 인수 유형 (0 index)이 숫자 일 때 형식 문자열로String.Format("{0:dddd MMMM}", 1234)
수확량 "dddd MMMM
")."의 수량 ":formatString
"유형별 옵션입니다 너무 큰 모든 것을 수동으로 확인하려면. 다른 방법이 있습니까? 아니면 불량 형식 문자열을 잠재적으로 지정하는 사용자와 함께 살아야합니까?
관습이 없다고 가정합니다 IFormatProvider
, ICustomFormatter
또는 IFormattable
여기에서 구현. .NET 프레임 워크에 이미 기본 유형 만 있습니다. 맞춤형 물건을 해결하기위한 보너스 포인트.
해결책
이 작업을 수행하는 내장 방법은 없습니다.
모든 공동 케이스를 수동으로 코딩 할 수 있지만 권장하지 않습니다.
(편집하다) 하나의 실용적인 옵션 일 수 있습니다 try/catch
- 사용자가 입력 할 때 가능한 한 빨리 형식을 테스트하십시오 ....
다른 팁
죄송하지만 방법은 다음과 같습니다.
try { string.Format(godKnowsWhat, aBunchOfArguments); }
catch(FormatException) { // use exception for control flow lol }
그래, 좀 나쁘다.
사용자가 지정한 잘못된 형식 문자열이 예외를 일으킬 수 있다면 시도해 볼 수 있습니까? 예, 순진하고 사소한 아이디어입니다.