[제목] int.TryParse() 의 한계
동료인 Steve가 웹 API 하나가 동작하지 않는다고 조사해 줄 것을 요청하였다. API를 좀 더 단순화 하면 아래와 같은 형태가 되는데, 몇 가지 값들을 입력받아 이를 DB에 저장하게 된다. 테스터가 이미 테스트를 완료한 API인데, 어디선가 오류가 발생한 듯하여 디버깅을 실행하였다.
URL ex) http://test.local/api/v1/add?name=sunrise&amount=15.00
디버깅을 하다 보니, amount 라는 입력파라미터를 처리하는 다음 라인에서 amt 가 0로 되는 것을 알 수 있었다.
// amount는 string int amt = GetInt(amount);
곧이어 GetInt() 메서드를 살펴보니, 아래와 같이 문자열을 받아 정수로 변환하고 변환이 실패하면 0을 리턴하게 되어 있었다.
public static int GetInt(string s) { const int DEFAULT = 0; int result; if (int.TryParse(s, out result)) { return result; } else { return DEFAULT; } }
언뜻 보기에는 별 문제가 없어 보이는데, 여기서 문제점은 int.TryParse()가 정수 문자열을 받아들일 경우는 문제가 없으나 만약 소숫점이 있는 Decimal 수를 받아들이면, FALSE를 리턴한다는 점이다. 즉, int.TryParse가 실패하면서 FALSE를 리턴하기 때문에 값 15.00 이 0으로 변경된 것이다. (Steve는 Creative하게 15 대신 15.00을 넣었다!)
언뜻 생각하기에는 int.TryParse()가 소수점 부분을 삭제하고 15를 리턴할 것으로 보이지만, 실제로 C#은 데이타 타입을 엄격히 따져 파싱을 못하겠다고 알려주게 된다. 따라서 위의 경우는 decimal.TryParse()를 사용하던지 아니면 입력값이 소숫점인지를 체크하는 루틴을 넣어 주어야 할 것이다.
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.