음...
문자열(String)이 숫자인지 아닌지 체크하는 함수가
VCL에서 따로 제공하지 않는것 같습니다.
VCL이용 문자열 체크
대게 vcl을 이용하여 숫자문자열 체크할때는
StrToInt 나
TryStrToInt 등의 함수를 이용하여
문자인지 숫자인지 체크하곤 합니다.
bool __fastcall IsNumber(String s)
{
__int64 num;
return TryStrToInt(s,num);
}
//---------------------------------
bool __fastcall IsNumber(String s)
{
__int64 num;
try
{
num=StrToInt(s);
}
catch(...)
{
return false;
}
return true;
}
위와같은 방식을 이용하는것도 좋은 방법이긴 한데..
한계가 있습니다.
문자열이 아주 긴경우에 StrToInt로 체크할수가 없습니다.
긴 문자열 체크
그래서 다음과 같음 함수를 만들어 보았습니다.
bool __fastcall IsNumberString(AnsiString str)
{
char *s=str.c_str();
if(*s=='-' ||*s=='+')s++;
while(*s)
{
if(*s<'0' || *s>'9')return false;
s++;
}
return true;
}
//---------------------------------------
bool __fastcall IsNumberString(String str)
{
wchar_t *s=str.c_str();
if(*s=='-' ||*s=='+')s++;
while(*s)
{
if(*s<'0' || *s>'9')return false;
s++;
}
return true;
}
//==========================================
bool __fastcall IsNumber( char *s)
{
if(s==NULL || *s==0)return false;
if(*s=='-' ||*s=='+')s++;
while(*s)
{
if(*s<'0' || *s>'9')return false;
s++;
}
return true;
}
//---------------------------------------
bool __fastcall IsNumber( wchar_t *s)
{
if(s==NULL || *s==0)return false;
if(*s=='-' ||*s=='+')s++;
while(*s)
{
if(*s<'0' || *s>'9')return false;
s++;
}
return true;
}
//---------------------------------------
IsNumberString 과 IsNumber 함수가 있는데..
한쪽은 String을 한쪽은 char *를 넘기는 함수입니다.
주의사항
주의1
위 함수에보면 함수 앞에 + , - 문자를 체크하는 기능이 있습니다.
필요없는 경우엔 제거하고 사용하세요
주의2
문자열 길이가 500~1000digit 넘어가지 않는다면
char*를 넘기는 함수가 속도가 많이 빠릅니다.
걍 대부분의 경우는 가독성이나 편리함을 위해 String을 넘기는 함수가 좋습니다.
하지만 함수호출이 굉장히 많이 반복되는 경우라면
char*( 또는 wchar_t *) 를 넘기는 함수를 사용하길 권합니다.
String 을 파라메터로 넘기는 경우에
reference 카운터만 증가하고 실제 데이타는 copy되지 않고 파라메터가 넘어가기 때문에..
웬만한 함수는 String을 넘겨도 실제 속도의 차이가 별로 없는데..
String파라메터 복사하는 시간이, 함수 전체 process시간에 비해 많이 걸리면서
문자열 길이가 짧으면 함수 사이에 속도차이가 많이 나게 되는것입니다.
즉, 속도가 아주 중요한 특별한 경우에는
char*를 넘기는 함수를 쓰거나 inline으로 하시는것이 좋다는 얘기입니다.
그럼..
하면 어떻나요?