ini->ReadFloat()



  • Hallo.

    Ich bekomme von verschiedensprachigen Systemen eine INI Datei.

    Das Problem ist jetzt das der Float-Wert in jeder INI anders hinterlegt ist

    mal als
    MaxValue=112,89
    oder
    MaxValue=112.89

    Entsprechend meiner Windows Sprachversion sagt er mal Error kein Float-Typ oder er verarbeitet es wie gewünscht. Hier fragen ich mich echt warum diese Art der Konvertert wie auch StrToFloat nicht '.' und ',' selbstständig vorher umwandeln.

    Kann ich ReadFloat() in die Tonne kloppen weil Borland nicht in der Lage war oben genanntes Feature zu implementieren? Was kann ich jetzt tun? Muss ich es als ReadString einlesen und dann das Trennzeichen entsprechend mit Replace() ersetzen und dann mit StrToFloat umwandeln oder gibt es noch einere bessere Lösung?

    DecimalSeperator zu setzen würde nur was bringen wenn ich wüsste welche Sprachversion die INI hat. Das weiss ich ja aber nicht bis ich den ersten Float-Wert eingelesen habe und ob es geklappt hat.

    Wie würdet ihr es lösen?



  • Hallo,

    Du könntest ja den Wert als String einlesen und dann testen.



  • Hallo

    Ich bekomme von verschiedensprachigen Systemen eine INI Datei.

    Das ist das Problem. Da ja jedes Sprachschema ein anderes Dezimaltrennzeichen haben kann, kann es ja gar kein allgemeines StrToFloat geben.

    Wenn du dir sicher bist, das an dieser Stelle immer ein gültiger Float steht, bei dem nur das Trennzeichen jeweils unterschiedlich sein kann, solltest du in der Tat den Wert als String auslesen, und diesen auf das erste Nichtzahl-Zeichen durchsuchen. Dann kannst du dieses durch das entsprechende Zeichen des lokalen Systems ersetzen, und dann mit StrToFloat konvertieren.

    bis bald
    akari



  • Wie findet ihr diese Lösung?
    Für atof() ist float ja immer mit '.'

    float StrToFloatEx(AnsiString Value)
    {
        Value = StringReplace(Value, DecimalSeparator, ".", TReplaceFlags() << rfReplaceAll);  
        return atof(Value.c_str());
    }
    

    Wie setzte ich den Flag 0? Muss man da immer
    TReplaceFlags() << rfReplaceAll // Alle esetzen
    bzw
    TReplaceFlags() >> rfReplaceAll // Nur erster Treffer
    eintragen?

    Über bessere Lösungen würde ich mich freuen 🤡



  • Hallo

    Das hilft dir auch nicht weiter. Nimm mal an du bekommst eine Ini aus einen Land wo '_' das Dezimaltrennzeichen ist. Du willst das auf einen deutschen System mit ',' als Dezimaltrennzeichen einlesen. Dann wird dein Ersetzen nicht laufen.

    Deshalb sollst du ja auch

    akari schrieb:

    diesen auf das erste Nichtzahl-Zeichen durchsuchen

    Dann kannst du das fremde Trennzeichen identifizieren und ersetzen.
    Und zwar durch den Wert, den die statische Variable DecimalSeperator hat, mit dieser arbeitet dann auch StrToFloat, was besser ist als atof.

    bis bald
    akari


Anmelden zum Antworten