Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi StrToInt('1,234') gibt es da was für? (https://www.delphipraxis.net/203120-strtoint-1-234-gibt-es-da-fuer.html)

DieDolly 15. Jan 2020 16:05

StrToInt('1,234') gibt es da was für?
 
Ich speichere eine Zahl folgendermaßen ab
Delphi-Quellcode:
Result := FloatToStrF(Num, ffNumber, 8, 0);
Auf einem englisch eingstellten Windows kommt da sowas wie 1,234 raus. Auf einem deutschen PC steht dort 1.234.
Wie kann ich diese Zahl system-unabhängig einlesen? 1.234 lässt sich mit StrToInt() auf einem deutschen Windows ohne Fehler einlesen.

Luckie 15. Jan 2020 16:12

AW: StrToInt('1,234') gibt es da was für?
 
Ist es nicht umgekehrt? Im deutschen ist das Komma das Dezimaletrennzeichen, im englischen der Punkt. Also sollte auf einem System mit englischen Regianaleinstellungen 1.234 rauskommen.

Was ist eigentlich genau die Eingabe und ist der Trenner, die Dezimaltrennung oder die Gruppierung?

Und berücksichtigt FloatToStr nicht die Regionaleinstellungen? Das heißt, wenn in der Datenquelle 1.234 englenglsich steht und formatiert das deutsch wird 1,234 angezeigt.

DieDolly 15. Jan 2020 16:14

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Ist es nicht umgekehrt? Im deutschen ist das Komma das Dezimaletrennzeichen, im englischen der Punkt. Also sollte auf einem System mit englischen Regianaleinstellungen 1.234 rauskommen.
Das weiß ich nicht, ist auch egal.

Zitat:

Was ist eigentlich genau die Eingabe und ist der Trenner, die Dezimaltrennung oder die Gruppierung?
Die Eingabe ist Entweder 1.234 oder 1,234 und soll irgendwie wieder zurück in einen Integer gebracht werden. Beides ist ein Integer, keine Gleitkommazahl. Die kommen nur von unterschiedlichen Systemen.

hoika 15. Jan 2020 16:15

AW: StrToInt('1,234') gibt es da was für?
 
Hallo,
da als Trenner ja nur Punkt oder Komma in Frage kommen,
würde ich mich für eine Variante entscheiden.

z.B. bei Punkt
StrReplace Komma durch Punkt (auf Verdacht)

und dann StrToFloatDef mit dem entsprechenden FormatSetting.
http://docs.embarcadero.com/products...@Extended.html

DieDolly 15. Jan 2020 16:16

AW: StrToInt('1,234') gibt es da was für?
 
Ich begehe ohnehin einen Fehler. Die Daten die geschrieben werden dienen einer Statistik und vorher formatiere ich diese eine Zahl noch.
Das habe ich jetzt rausgenommen.

Medium 15. Jan 2020 16:18

AW: StrToInt('1,234') gibt es da was für?
 
Ich würde Gruppentrenner komplett entfernen. In Indien z.B. gruppiert man nichtmals strikt in 3er Päckchen, sondern... äh, irgendwie anders :D

Um also universell zu ein, würde ich sämtliche Punktierung und Spaces vorab entfernen - geht bei Ints ja zum Glück recht einfach ohne was kaputt zu machen.

Luckie 15. Jan 2020 16:23

AW: StrToInt('1,234') gibt es da was für?
 
Also ist der Punkt und das Komma die Gruppierung. Da hilft, glaube ich, nur StringReplace.

Uwe Raabe 15. Jan 2020 16:25

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Zitat von DieDolly (Beitrag 1455226)
1.234 lässt sich mit StrToInt() auf einem deutschen Windows ohne Fehler einlesen.

Das stimmt nicht! Das gibt einen Fehler '1.234' ist kein gültiger Integerwert.

Mit
Delphi-Quellcode:
StrToInt('1.234'.Replace('.', '').Replace(',', ''))
sollte es aber gehen - auch bei '1,234'.

DieDolly 15. Jan 2020 16:27

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Das stimmt nicht! Das gibt einen Fehler '1.234' ist kein gültiger Integerwert.
Komisch, bei mir nicht. 1,234 dagegen gibt genau den Fehler. Mein Trennzeichen ist standardmäßig auf , eingestellt.

Neutral General 15. Jan 2020 16:44

AW: StrToInt('1,234') gibt es da was für?
 
Die wichtigste Frage die hier nirgendwo beantwortet wird:

Soll der Wert der Zahl 1234 oder 1,234 sein?
Ich glaube ansonsten reden wir aneinander vorbei.

DieDolly 15. Jan 2020 16:51

AW: StrToInt('1,234') gibt es da was für?
 
Ich speichere die Zahl jetzt ohne Formatierung ab. Aber vorher war es systemabhängig ob 1.234 oder 1,234 gespeichert wurde. Intern sollte es aber als 1234 verarbeitet werden.
Das sind statistische Daten. Deswegen habe ich die Formatierung jetzt rausgenommen. Die findet jetzt woanders statt.

stifflersmom 15. Jan 2020 16:52

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Zitat von Neutral General (Beitrag 1455241)
Die wichtigste Frage die hier nirgendwo beantwortet wird:

Soll der Wert der Zahl 1234 oder 1,234 sein?
Ich glaube ansonsten reden wir aneinander vorbei.

Eigentlich nicht. Da ein Integer generell ja keine Nachkommastellen hat und der TE expliziet vom StrToInt spricht, reicht es doch aus, generell Kommas und Punkte aus der Zeichenkette vor dem Umwandeln zu entfernen.

Luckie 15. Jan 2020 17:05

AW: StrToInt('1,234') gibt es da was für?
 
Deswegen wollte ich die explizit Wissen haben, ob es sich um ein Dezimaltrennzeichen oder um ein Gruppierungstrennzeichen handelt.

Redeemer 15. Jan 2020 18:31

AW: StrToInt('1,234') gibt es da was für?
 
Ich frage Windows, was der Nutzer für ein Tausendertrennzeichen hat und lösche dieses, bevor ich irgendwas von String to Kommazahl umwandel.
Delphi-Quellcode:
function StrToCurrLocal(const s: string): Currency;
begin
  Result := StrToCurr(StringReplace(s, GetLocaleChar(GetThreadLocale(), LOCALE_STHOUSAND, #0), '', [rfReplaceAll]));
end;
Extended analog.

Uwe Raabe 15. Jan 2020 21:28

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Zitat von Redeemer (Beitrag 1455262)
Ich frage Windows, was der Nutzer für ein Tausendertrennzeichen hat und lösche dieses, bevor ich irgendwas von String to Kommazahl umwandel.

Das funktioniert aber auch nicht immer, wenn die Datei auf einem anderen Windows erzeugt wurde.

DieDolly 15. Jan 2020 21:42

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Das funktioniert aber auch nicht immer, wenn die Datei auf einem anderen Windows erzeugt wurde.
Deswegen speichere ich sie jetzt ohne rumzufummeln ab.

Ydobon 15. Jan 2020 23:15

AW: StrToInt('1,234') gibt es da was für?
 
Wenn für Nachkommastellen Null angegeben ist, dann können es doch eigentlich nur Tausendertrenner sein.

Luckie 15. Jan 2020 23:25

AW: StrToInt('1,234') gibt es da was für?
 
Ist mittlerweile alles geklärt.

DieDolly 16. Jan 2020 05:56

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Wenn für Nachkommastellen Null angegeben ist
Es ist aber keine Dezimalzahl.

Codehunter 16. Jan 2020 11:09

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Zitat von Luckie (Beitrag 1455283)
Ist mittlerweile alles geklärt.

Nicht ganz...

Zitat:

Zitat von Luckie (Beitrag 1455228)
Also sollte auf einem System mit englischen Regianaleinstellungen 1.234 rauskommen.

Was hat dich nur zu diesem Freudschen Vertipper gebracht? :lol:

So, Thema fertig. Deckel zu und Licht aus. 8-)

Dennis07 16. Jan 2020 16:56

AW: StrToInt('1,234') gibt es da was für?
 
Wieso denn nicht einfach, so wie vorgesehen, mit den Formateinstellungen arbeiten?

Unter XE2 oder neuer:
Delphi-Quellcode:
1.234.ToString(TFormatSettings.Invariant) // Ergibt '1.234', auch auf deutschen Systemen
Zwischen D2009 und XE2 musstest du die FormatSettings-Variable zwischenspeichern, bearbeiten und wiederherstellen, und dort manuell den DezimalSeparator auf
Delphi-Quellcode:
'.'
setzen.
Vor 2009 kenne ich keine Möglichkeit mehr, wie das ging, weil ich mit so alten Versionen schon seit Jahren nicht mehr arbeite.

Bbommel 17. Jan 2020 09:19

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Zitat von Dennis07 (Beitrag 1455360)
Wieso denn nicht einfach, so wie vorgesehen, mit den Formateinstellungen arbeiten?

Unter XE2 oder neuer:
Delphi-Quellcode:
1.234.ToString(TFormatSettings.Invariant) // Ergibt '1.234', auch auf deutschen Systemen

Schönes Beispiel, wie einem ein Thread, der eigentlich schon durch ist und in den ich nur mal so reingeklickt habe, einen total guten Hinweis gibt, weil da ein "neues" Feature seit Jahren an mir vorbeigegangen ist.

Ich benutze immer noch treudoof eine lokale TFormatSettings-Variable und setze den Decimalseperator auf "." und den ThousendSeperator auf ",". Dieses TFormatSettings.Invariant ist ziemlich cool, da werde ich mal ein paar Stellen im Code aufräumen können. :-)

Dennis07 17. Jan 2020 10:42

AW: StrToInt('1,234') gibt es da was für?
 
Zitat:

Zitat von Bbommel (Beitrag 1455398)
Schönes Beispiel, wie einem ein Thread, der eigentlich schon durch ist und in den ich nur mal so reingeklickt habe, einen total guten Hinweis gibt, weil da ein "neues" Feature seit Jahren an mir vorbeigegangen ist.

Ich benutze immer noch treudoof eine lokale TFormatSettings-Variable und setze den Decimalseperator auf "." und den ThousendSeperator auf ",". Dieses TFormatSettings.Invariant ist ziemlich cool, da werde ich mal ein paar Stellen im Code aufräumen können. :-)

Danke, haha. Wenns dir hilft. Hatte mich wirklich verwundert dass das hier noch keiner geschrieben hatte, weil es eigentlich in heutigen Delphi-Versionen der offiziell vorgeschlagene Weg ist. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz