IsInteger



  • #include <string>
    #include <locale>
    template < std::ctype_base::mask check >
      bool character_is(char character)  {
        return std::use_facet< std::ctype<char> >( std::locale( "C" ) ).is( check , character );
      }   
    
    bool isInteger(std::string const & str){
      std::string::const_iterator start = str.begin(), end = str.end();
      // if therer is a minus, plus or a space it will "eliminated" for checking. 
      char tmp = 0;
      while((tmp = *start) == '-' || tmp == '+' || tmp == ' ')
          ++start;
      // comparing the string whether all signs are digits
      while(start != end)
          if(!character_is<std::ctype_base::digit>(*start++))
              return false;
      return true;
    }
    


  • eViLiSSiMo schrieb:

    #include <string>
    #include <locale>
    template < std::ctype_base::mask check >
      bool character_is(char character)  {
        return std::use_facet< std::ctype<char> >( std::locale( "C" ) ).is( check , character );
      }   
    
    bool isInteger(std::string const & str){
      std::string::const_iterator start = str.begin(), end = str.end();
      // if therer is a minus, plus or a space it will "eliminated" for checking. 
      char tmp = 0;
      while((tmp = *start) == '-' || tmp == '+' || tmp == ' ')
          ++start;
      // comparing the string whether all signs are digits
      while(start != end)
          if(!character_is<std::ctype_base::digit>(*start++))
              return false;
      return true;
    }
    

    sowas mag ich aber nicht schreiben.



  • @volkard
    🤡
    Kann ich verstehen. Ich poste nur diese kranke locale variante sogern *g*

    🤡

    MfG



  • eViLiSSiMo schrieb:

    @volkard
    🤡
    Kann ich verstehen. Ich poste nur diese kranke locale variante sogern *g*

    🤡

    MfG

    mal ohne auf laufzeit zu achten, kann man nicht in zwei zeilen den string zu nem stringstream machen und nen int aus dem stringstream lesen und schauen, obs funktioniert hat?



  • volkard schrieb:

    mal ohne auf laufzeit zu achten, kann man nicht in zwei zeilen den string zu nem stringstream machen und nen int aus dem stringstream lesen und schauen, obs funktioniert hat?

    Wenn man darauf achtet das der stream danach leer ist... ("42mio_rote_rosen_zum_v-day")

    Aber kommt es nicht eher darauf an wann IsInteger true liefern soll?
    if (passt in ein int) || (ist Ganzzahl)? :



  • finix schrieb:

    volkard schrieb:

    mal ohne auf laufzeit zu achten, kann man nicht in zwei zeilen den string zu nem stringstream machen und nen int aus dem stringstream lesen und schauen, obs funktioniert hat?

    Wenn man darauf achtet das der stream danach leer ist... ("42mio_rote_rosen_zum_v-day")

    Aber kommt es nicht eher darauf an wann IsInteger true liefern soll?
    if (passt in ein int) || (ist Ganzzahl)? :

    Diese Frage wuerde ich ganz klar als IstGanzahl beantworten 😉

    mfg
    v R



  • virtuell Realisticer schrieb:

    Diese Frage wuerde ich ganz klar als IstGanzahl beantworten 😉

    Echt? Sehe ich gar nicht so.. Mal ganz davon abgesehen dass die int-Variante besser isConvertible<int> o.ä. heißen sollte macht es schon Sinn, da, wie volkard schon angedeutet hat, das konvertieren deutlich langsamer als das reine prüfen ist.



  • volkard schrieb:

    eViLiSSiMo schrieb:

    @volkard
    🤡
    Kann ich verstehen. Ich poste nur diese kranke locale variante sogern *g*

    🤡

    MfG

    mal ohne auf laufzeit zu achten, kann man nicht in zwei zeilen den string zu nem stringstream machen und nen int aus dem stringstream lesen und schauen, obs funktioniert hat?

    nein geht net. habs probiert er macht das ohne murren und gibt nen müll zurück
    // Edit: er gibt müll zurück wenn es sich net um n Integer handelt



  • nein geht net. habs probiert er macht das ohne murren und gibt nen müll zurück
    // Edit: er gibt müll zurück wenn es sich net um n Integer handelt

    du musst auch zu erst 'von hand' prüfen, ob beim auslesen im stringstream ein fehler-bit gesetzt wurde. der rest ist bei der frage, ob das einlesen in den int geklappt hat, erstmal nebensächlich.



  • Stimmt. Daran hatte ich ja gar net gedacht, das da n failbit gesetzt sein könnte.
    "Der Ta'uri evilissimo bedankt sich bei den Asgard" 😉

    bool isInt(std::string const & str) {
       std::stringstream sstr(str);
       int test;  
       sstr >> test;
       return sstr;
     }
    


  • Will ja nicht kleinlich sein, aber...

    #include <iostream>
    #include <iomanip>
    #include <sstream>
    #include <string>
    
    bool isInt(std::string const & str) {
       std::stringstream sstr(str);
       int test;  
       sstr >> test;
       return sstr;
    }
    
    bool isInteger(std::string const & str) {
       std::stringstream sstr(str);
       int test;  
       sstr >> test;
       return !sstr.fail() && sstr.eof();
    }
    
    int main()
    {
      const int N = 3;
      const std::string test[N] = {"x42", "42", "42x"};
      std::cout << std::boolalpha;
      for (int i = 0; i < N; ++i) {
        std::cout << "isInt(\"" << test[i] << "\") ? " << isInt(test[i]) << "\n"
                  << "isInteger(\"" << test[i] << "\") ? " << isInteger(test[i]) << "\n"
                  << std::endl;
      }
    }
    


  • Hast ja recht, faulheit sollte bestraft werden *g*



  • ginge das nicht über metaprogrammierung?



  • *** schrieb:

    ginge das nicht über metaprogrammierung?

    Falls du Template Meta Programmierung meinst NEIN
    Strings können nicht zur Compilierzeit ausgewertet werden damit geht das net.

    MfG



  • eViLiSSiMo schrieb:

    "Der Ta'uri evilissimo bedankt sich bei den Asgard" 😉

    Gern geschehen 👍 😃


Anmelden zum Antworten