DecimalSeparator



  • Ich hab mir immer so geholfen (z.B: bei SQL Anweisung wird das Komma immer als Parametertrenner benutzt, deshalb ist hier der '.' das Komma).

    char c = DecimalSeparator;
    DecimalSeparator = '.';
    
    //... Konvertieren, konvertieren.....
    
    DecimalSeparator = c;
    


  • Unter dem Link von KlausB steht die Lösung für das SQL-Problem...

    Ich glaub ich werd in allen meinen Programmen zukünftige den Windows Dezimaltrennzeichen auf 'x' setzen. Sieht bestimmt lustig, wenn dann jemand eine Excel-Tabelle oder so öffnet.

    VergissEs schrieb:

    also ich würde nicht für mein Programm den DecimalSeparator verändern nur um es mir einfacher zu machen mit dem Programmieren. Den in Deutschland ist halt der Dezimaltrenner ein Komma!

    Sehe ich genau so.

    VergissEs schrieb:

    Schreib dir lieber eine Funktion die deinen String Wert von den DecimalSeparator in deinen gewünschten Dezimaltrenner umwandelt bzw. umgekehrt.

    Das ist gar nicht nötig. AnsiString bietet entsprechende Formatierungs- und Konvertierungsmethoden.



  • Hi.

    Ok, machen wir mal nen Beispiel:

    Ich habe eine ComboBox, welche die Schrittweite von SpinEdits festlegt.
    Sagen wir mal mit dem Inhalt:

    0,1
    0,25
    0,5
    0,75
    1,0

    Und nun zum Problem.
    Vordefinieren in Items geht nicht, da man ja es auf allen Sprachen laufen lassen will. Es sei man schaltet später bei der Übergabe einen Konverter ein der aus dem im ComboBox festgelegten Zeichen das DecimalSeperator Zeichen macht.

    Oder man macht beim erstellen des Programmes eine if DecimalSeperator == ',' dann fülle die ComboBox mit dem Datensatz und wenn '.' mit dem Anderen. Also einmal die float mit ',' und sonst mit '.'.

    Letzteres wohl eher nicht.. aber das mit dem Konverter find ich auch nicht sehr gut. Es ist immernoch einfacher einfach das Zeichen auf einen festen Wert zu setzen, aber stimmt schon für andere Länder hat dann das Trennzeichen ne gehirninterne andere Bedeutung, wobei bei Programmiersprachen der Punkt das allgegenwärtige Dezimaltrennzeichen ist 🙂



  • FloatToStr übernimmt doch den Kommatrenner aus der Systemsteuerung und zum berechnen musste ja erst den String in einen Float mit StrToFloat umwandeln also wird automatisch dein sichtbares Komma zu einen Punkt.



  • Bitte mal ausprobieren: Caption = FloatToStr(StrToFloat("0.125"));
    Wenn dein System als Decimalzeichen jetzt kein '.' hat sollte es nicht funktionieren. Bei mir sagt er jedenfalls keine Floatzahl.



  • Moahhhh wiso soll ich das austesten was klar logisch nicht geht!

    Wie gesagt in Deutschland ist der Dezimaltrenner ein KOMMA!
    Also ist der String ("0.125") kein Kommawert da er ja ("0,125")
    sein müsste.

    und wenn du deine oben aufgeführte liste nimmst dann klappts auch
    0,1
    0,25
    0,5
    0,75
    1,0

    Ich hoffe für dich du hast nie Kontakt mit Datumsumwandlungen Deutschland/Englisch ich glaub da bekommste nen größeren koller 🙂



  • Ich glaub du hast nicht im geringsten meinen Beitrag verstanden.
    Genau das ist ja das Problem. Wenn ich es jetzt als "," ablege, können es anschliessend englische eingestellte OS nicht lesen. Ich wollte nur darauf hinweisen und nicht ne Prollgeschichte hören.



  • Imperator schrieb:

    Genau das ist ja das Problem. Wenn ich es jetzt als "," ablege, können es anschliessend englische eingestellte OS nicht lesen. Ich wollte nur darauf hinweisen und nicht ne Prollgeschichte hören.

    Das Problem wird sein, dass Du die 'Werte' direkt in der IDE in die Listbox eingetragen hast, oder direkt Strings hineinschreibst. Wenn Du statt dessen double verwendest und diese erst beim Eintragen in die Listbox in Strings wandelst, klappt das hervorragend.

    double dCurValue = 0.1;
    ListBox1->Items->Add(AnsiString(dCurValue));
    

    In der Listbox wird jetzt das korrekte Dezimaltrennzeichen verwendet, so wie es unter Windows eingestellt ist.



  • Ja stimmt. Das war aber nur ein Beispiel, ich hätte auch sagen können das ich eine Textdatei lesen möchte(die von wem anderen nunmal zu vorgegeben ist) ala:

    id;name;wert1;wert2
    1;maik;0.123;1.25
    2;thomas;5.245;3.0

    Wieder würde es heissen eigenen Filter zu schreiben der . in jeweiligen DecimalSeparator umwandelt. Mit den hauseignen Funktionen kommt man da wohl leider nicht weit.



  • Seit wann speichert man Fließkommawerte in Textdateien?



  • Wissenschaftliche Programme lesen/speichern Daten häufig in Plaintext (da die meisten häufig alle auch nur ihr eigenes Format unterstuetzen). Damit stellste auch sicher, dass das Zeugs von diversen anderen Programmen, die so einen Import unterstützen, auch gelesen werden kann. Ein einfacher Textparser ist schneller geschrieben, als ein Importmodul fuer irgendein exotischen Fileformat.

    Beispiele findest du unter: http://www.ics.uci.edu/~mlearn/MLRepository.html ( http://www.ics.uci.edu/~mlearn/databases/ )

    @Imperator

    mach doch einen Importdialog alla Excel. dort kann der User dann einstellen, wie Dezimal-, Tausender- und Feldtrennzeichen lauten. und nen . in den passenden Decimalsep. umzuwandeln ist doch nun echt kein Akt. Verstehe deine Aufregung nicht. Wenn möglich lege deine Daten nie fest in deinem Programm ab!



  • Na dann hoffen wir mal, dass in den Textdateien nicht auch die 1000er-Trennzeichen drin sind...

    Intern würde ich die Daten in einem proprietären Format speichern, jedoch eine Exportfunktion für Textdateien erstellen. Somit können Dateien, unabhängig vom Dezimaltrennzeichen, ausgetauscht werden. Und für einen Import in ein anderes Programm kann dann auf dem Zielsytem eine passende Textdatei erzeugt werden.

    Von Excel würde ich generell die Finger lassen, dann lieber eine Datenbank. (Obwohl das mit Kanonen auf Spatzen schießen ist.)


Anmelden zum Antworten