bool isNumeric(string s){
if ( !s.empty() && s[0] != '-' )
s = "0" + s; //prepend 0
string garbage;
stringstream ss(s);
ss >> *(auto_ptr<double>(new double)) >> garbage;
/*
//the line above extracts the number into an anonymous variable. it could also be done like this:
double x;
ss >> x >> garbage;
*/
//if there is no garbage return true or else return false
return garbage.empty();
}
작동 방식 :
문자열 스트림 >> 과부하는 문자열을 다양한 산술 유형으로 변환 할 수 있습니다. 문자열이 부족해질 때까지 문자열 스트림 (이 경우 ss)에서 문자를 순차적으로 읽거나 다음 문자가 저장 기준을 충족하지 않습니다. 대상 변수 유형으로.
예 1 :
stringstream ss("11");
double my_number;
ss >> my_number; //my number = 11
예 2 :
stringstream ss("011");
double my_number;
ss >> my_number; //my number = 11
예 3 :
stringstream ss("11ABCD");
double my_number;
ss >> my_number; //my number = 11 (even though there are letters after the 11)
"쓰레기"변수 설명 ":
왜 내 double 로의 추출에 유효한 값이 있는지 확인한 다음 true를 반환하지 않습니까?
입력 문자열이 "11ABCD"(숫자가 아님) 인 경우에도 위의 example3은 여전히 숫자 11을 my_number 변수로 읽습니다.
이 경우를 처리하기 위해 문자열 변수 (가비지라는 이름)로 다시 추출하여 double 유형의 변수로 초기 추출 후 문자열 버퍼에 남아있을 수있는 모든 것을 읽을 수 있습니다. 남은 것이 있으면 "쓰레기"로 읽어들입니다. 이는 전달 된 전체 문자열이 숫자가 아님을 의미합니다 (단지 1로 시작 함). 이 경우 우리는 false를 반환하고 싶습니다;
앞에 붙은 "0"설명 ":
단일 문자를 이중으로 추출하려고 시도하면 실패하지만 (0을 이중으로 리턴) 문자열 버퍼 위치를 문자 다음으로 계속 이동합니다. 이 경우 가비지 읽기가 비어서 함수가 true를 잘못 리턴합니다. 이 문제를 해결하기 위해 문자열 앞에 0을 추가하여 전달 된 문자열이 "a"인 경우 "0a"로 변경되어 0이 이중으로 추출되고 "a"가 가비지로 추출됩니다.
앞에 0을 붙이면 숫자 값에 영향을 미치지 않으므로 숫자가 여전히 이중 변수로 올바르게 추출됩니다.
if (expr) return true; return false;
! 그냥 쓰십시오return expr;
.