|
#define ISNOTNUMERIC(n) ((n) < '0' || (n) > '9')
bool isValidNumber(const char *str){
if (*str == '-' || *str == '+') str++; // 부호 긍정
if (*str == '.'){
str++; // "." 부정
do if (ISNOTNUMERIC(*str)) return false; while(*++str);
return true;
}
do{
if (ISNOTNUMERIC(*str)) return false;
str++;
if (*str == '.'){ // 소수점 긍정 & 복수 '.' 부정
while(*++str) if (ISNOTNUMERIC(*str)) return false;
return true;
}
}while(*str);
return true;
}
사용법:
if (!isValidNumber(AnsiString(a).c_str())) ShowMessage("Oops");
TryStrToFloat 과 위 함수의 성능비교 (rdtsc 소요카운트)
10000 자리 스트링의 1000000 번 반복 수행시
27190674 <- 위 함수
156447189 <- TryStrToFloat
어차피 정상적인 숫자인지를 테스트한다는건 입력을 숫자형태로 변환하는 용도가 포함되게 마련일테니
TryStrTo~~함수 처럼 만들어낼 숫자의 타잎의 레퍼런스를 받는 구조가 합당할 듯 합니다.
해당 부분을 추가하고 나면 이 코드의 속도도 비등비등한 수준이 되어버리겠죠.
빌더에서 저런 함수를 만들어 쓴다면 삽질로 분류되어도 좋을듯 합니다만,
저런 함수가 존재하지 않는 시스템에서는 참고가 되리라 생각하고 남겨두겠습니다.
|