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();
}
มันทำงานอย่างไร:
stringstream >> overload สามารถแปลงสตริงเป็นประเภทเลขคณิตต่างๆได้โดยการอ่านอักขระตามลำดับจาก stringstream (ss ในกรณีนี้) จนกว่าอักขระจะหมดหรืออักขระถัดไปไม่ตรงตามเกณฑ์ที่จะจัดเก็บ ลงในประเภทตัวแปรปลายทาง
example1:
stringstream ss("11");
double my_number;
ss >> my_number; //my number = 11
example2:
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)
คำอธิบายตัวแปร "ขยะ":
ทำไมไม่ลองตรวจสอบดูว่าการสกัดเป็นสองเท่าของฉันมีค่าที่ถูกต้องหรือไม่แล้วส่งคืนจริงถ้าเป็นเช่นนั้น
สังเกตว่า example3 ด้านบนจะยังคงอ่านหมายเลข 11 ในตัวแปร my_number ได้สำเร็จแม้ว่าสตริงอินพุตจะเป็น "11ABCD" (ซึ่งไม่ใช่ตัวเลข)
ในการจัดการกรณีนี้เราสามารถทำการแยกอีกครั้งในตัวแปรสตริง (ซึ่งฉันตั้งชื่อขยะ) ซึ่งสามารถอ่านสิ่งที่อาจเหลืออยู่ในบัฟเฟอร์สตริงหลังจากการแยกครั้งแรกในตัวแปรประเภท double หากมีสิ่งใดหลงเหลืออยู่จะถูกอ่านว่าเป็น "ขยะ" ซึ่งหมายความว่าสตริงเต็มที่ส่งเข้ามาไม่ใช่ตัวเลข (เพิ่งเริ่มต้นด้วยหนึ่ง) ในกรณีนี้เราต้องการคืนค่าเท็จ
คำอธิบาย "0" ที่นำหน้า:
การพยายามแยกอักขระเดี่ยวเป็นคู่จะล้มเหลว (คืนค่า 0 เป็นคู่ของเรา) แต่จะยังคงย้ายตำแหน่งบัฟเฟอร์สตริงไปที่หลังอักขระ ในกรณีนี้การอ่านขยะของเราจะว่างเปล่าซึ่งจะทำให้ฟังก์ชันคืนค่าจริงไม่ถูกต้อง ในการหลีกเลี่ยงสิ่งนี้ฉันใส่เครื่องหมาย 0 ไว้ข้างหน้าสตริงดังนั้นถ้าตัวอย่างเช่นสตริงที่ส่งผ่านคือ "a" มันจะเปลี่ยนเป็น "0a" เพื่อให้ 0 ถูกแยกออกเป็นคู่และ "a" จะถูกแยกออกเป็นขยะ
การเติม 0 จะไม่ส่งผลต่อค่าของตัวเลขดังนั้นตัวเลขจะยังคงถูกแยกออกเป็นตัวแปรคู่ของเราอย่างถูกต้อง
if (expr) return true; return false;
!return expr;
เขียนเพียง