C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1068] [String] IsNumberString
장성호 [nasilso] 5340 읽음    2011-10-18 12:31
음...

문자열(String)이  숫자인지 아닌지 체크하는 함수가
VCL에서 따로 제공하지 않는것 같습니다.

VCL이용 문자열 체크

대게 vcl을 이용하여 숫자문자열 체크할때는

StrToIntTryStrToInt 등의 함수를 이용하여
문자인지 숫자인지 체크하곤 합니다.

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으로 하시는것이 좋다는 얘기입니다.
  

그럼..
이경문 [gilgil]   2011-10-18 16:40 X
IsNumberString(String& str)
하면 어떻나요?
장성호 [nasilso]   2011-10-19 12:29 X
아~!
그렇게 하면 별반 차이가 없네요
String은 습관적으로 call by value로 넘기다 보니 생각못했습니다.

+ -

관련 글 리스트
1068 [String] IsNumberString 장성호 5340 2011/10/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.