float auf gültigkeit prüfen



  • hallo nochmals.

    ich habe mir schnell eine funktion geschrieben, die überprüft, ob ein float in string form gültig ist. gerne würde ich eure meinung zur funktion wissen:

    //---------------------------------------------------------------------------
    bool IsFloat(String input)
    {
    	if(input.Length() <= 0) return false;
    	else
    	{
    		bool dot_found = false;
    		if(!IsNumericSymbol(input[1]) || !IsNumericSymbol(input[input.Length()])) return false;
    		for(int i = 1; i <= input.Length(); i++)
    		{
    			if(!IsNumericSymbol(input[i]) && input[i] != '.' || input[i] == '.' && dot_found) return false;
    			if(input[i] == '.') dot_found = true;
    		}
    	}
    	return true;
    }
    

    ich möchte damit nur sicherstellen das es die form vorzahlen_punkt_nachkommastellen hat. ist die funktion dafür gut geschrieben?

    p.s. die funktion IsNumericSymbol ist hier nicht ersichtlich. sie überprüft aber auch nur ob das zeichen 0-9 ist. danke für eure meinung.



  • forken schrieb:

    if(input.Length() <= 0) return false;
    	else
    

    Wenn du schon early return machst, dann lass das else und die damit verbundene tiefere Schachtelung weg.

    Reguläre Ausdrücke willst du nicht verwenden?



  • tzern schrieb:

    Wenn du schon early return machst, dann lass das else und die damit verbundene tiefere Schachtelung weg.

    stimmt, dass habe ich jetzt völlig übersehen.

    tzern schrieb:

    Reguläre Ausdrücke willst du nicht verwenden?

    nein. also ich möchte wirklich nur z.B. das format 123.456, 12.45, 1.2 etc. als gültig sehen.



  • mein erster gedanke dazu sieht so aus:

    bool IsFloat(String input) 
    { 
        if(input.Length() <= 0) return false; 
        int dot_pos = -1; 
        for(int i = 1; i <= input.Length(); i++) 
        { 
           if(IsNumericSymbol(input[i]))
              continue;//ziffern sind immer gut
           if(input[i]=='.')
              if(dot_pos==-1)
                 dot_pos=i;//der erste punkt
              else
                 return false;//der zweite punkt
            } 
        }
        if(dot_pos<1 || dot_pos>input.Length()-1)
           return false;
        return true;
    }
    


  • if(input.Length() <= 0) return false;
    

    ==>

    if(input.empty()) return false;
    

    Ich glaube nicht, dass die Länge einer guten String-Klasse unter 0 sein kann - und für gleich 0 gibt es nun mal empty ^^

    bb

    edit:
    ich würde einen bool für dot nehmen...
    auch würde ich keine eingaben á la ".5" verschmähen ^^

    bool IsFloat(String input) 
    { 
        if(input.empty()) return false; 
        bool haveDot = false;
        for(String::SizeType i (0), e(input.Length()); i != e; ++i) 
        { 
           if(IsNumericSymbol(input[i]))
              continue;//ziffern sind immer gut 
           if((input[i]=='.') || (input[i]==',')) //, und . erlauben
           {
              if (haveDot) return false;
              haveDot = true;
           }
        } 
        return true; 
    }
    

    diese variante sollte alles zulassen, was in etwa so aussieht:

    ,23       //0,23
    .1        //0,1
    .         //0
    0         //0
    12        //12
    0.12      //0,12
    5,54      //5,54
    

    NICHT aber so etwas:

    *T*T* //T ist '.' oder ',' - * ist eine beliebige Ziffernfolge (muss aber nicht vorhanden sein)
    

    bb


Anmelden zum Antworten