Показать сообщение отдельно
Старый 20.10.2010, 13:31   #28
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Проверка: является ли строка числом?

В своё время не придал значению тому, что пустая строка ("") воспринимается как допустимое значение (подразумевая 0). При тестировании функции (точнее её реализации на Blitz3D) в полевых условиях с применением "эффекта кота" обнаружились (ВНЕЗАПНО?) дополнительные допустимые конструкции, которые уже с натяжкой можно списать на интеллектуальность парсера "строка->число". Исправляется всё просто.
Для проверки используется набор значений impersonalis-F1(FAIL-1):
E
(пустая строка)
+
-
.
Функция:
bool Check(char *s,int LEN){
	enum SymbolIs{DIGIT,EXP,SEP,SIGN,ETC};
	SymbolIs Key;
	int i;
	int Epos=-1;
	int Spos=-1;
	bool ExitFlg=true;
	bool IsClose=false;
	for(i=0;i<LEN && ExitFlg;i++){
		if(s[i]>='0' && s[i]<='9'){
			Key=DIGIT;
		}
		else if(s[i]=='E' || s[i]=='e'){
			Key=EXP;
		}
		else if(s[i]=='.' || s[i]==','){
			Key=SEP;
		}
		else if(s[i]=='+' || s[i]=='-'){
			Key=SIGN;
		}
		else{
			Key=ETC;
		}
		IsClose=false;
		switch(Key){
			case DIGIT:{
				IsClose=true;
				break;
					   }
			case EXP:{
				if(Epos!=-1){
					ExitFlg=false;
					break;
				}
				Epos=i;
				break;
					 }
			case SEP:{
				if(Spos!=-1){
					ExitFlg=false;
					break;
				}
				Spos=i;
				break;
					 }
			case SIGN:{
				if(i==0 || Epos==i-1){
					break;
				}
				ExitFlg=false;
				break;
					  }
			case ETC:{
				ExitFlg=false;
				break;
					 }
		}
	}
	if(!IsClose){
		ExitFlg=false;
	}
	return ExitFlg;
}
Если закомментить строку сброса ExitFlg при лжи в IsClose функция вновь не проходит новый тест.
Test "SBJoker"
ололо  0
15445.1 1
Test "impersonalis"
12БЛДЖАД!       0
Test "Phantom"
123.345E-12     1
Test "zombiee"
23.2gh465E-1    0
23.2465E-1      1
sdgf23.2465E-1  0
Test "impersonalis-2"
1+1     0
+.12E-008       1
+.12E-008.1     0
Test "impersonalis-F1"
E       0
        0
+       0
-       0
.       0
Присылайте ваши наборы с аргументацией некорректности работы функции!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (21.10.2010)