Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma) (https://www.delphipraxis.net/182126-float-je-nach-geraeteeinstellung-als-string-convertieren-punkt-oder-komma.html)

Kostas 2. Okt 2014 11:23

Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
Hallo Zusammen,

in einer Android App wird ein Float als String ausgegeben.
Je nach Device werden die Nachkommastellen als Punkt oder Komma konvertiert.

Delphi-Quellcode:
    ENUSLat := FDFahrzeug.FieldByName('lat_y').AsString;
    ENUSLong := FDFahrzeug.FieldByName('lon_x').AsString;
Ich weis es gibt eine Methode die die Culture vom Device überprüft und richtig konvertiert,
ich komme jedoch nicht auf den Namen.

Hat jemand eine Idee?

Gruß Kostas

Der schöne Günther 2. Okt 2014 11:30

AW: Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
Was meinst du mit "richtig" konvertiert? Das auf allen Geräten, egal welche Sprache, die Zahl immer mit einem Punkt als
Delphi-Quellcode:
DecimalSeparator
ausgegeben wird?

Nimm doch das TField::AsFloat und formatiere es mit ToString(..) und deinen gewünschten TFormatSettings:
Delphi-Quellcode:
uses
  System.SysUtils;
var
   myFloat: Single;
   myFormatSettings: TFormatSettings;
begin
   myFloat := 3.14;
   myFormatSettings := TFormatSettings.Create('en-us');

   Writeln( myFloat.ToString(myFormatSettings) );
end.

himitsu 2. Okt 2014 11:40

AW: Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
Und "früher" war dafür der zweite Parameter in FloatToStr. :stupid:

Der schöne Günther 2. Okt 2014 12:49

AW: Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
PS: Ich kenne mich ja mit Datenbanken eigentlich überhaupt nicht aus. Aber würde das "AsString" nicht die Umwandlung "Zahl -> String" an die Zugriffsschicht (oder etwa das DBMS selbst?) weiterschieben?

Insofern wundert es mich, dass das überhaupt regionsabhängig war.

Kostas 2. Okt 2014 13:19

AW: Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1274595)
Was meinst du mit "richtig" konvertiert? Das auf allen Geräten, egal welche Sprache, die Zahl immer mit einem Punkt als
Delphi-Quellcode:
DecimalSeparator
ausgegeben wird?

Nimm doch das TField::AsFloat und formatiere es mit ToString(..) und deinen gewünschten TFormatSettings:
Delphi-Quellcode:
uses
  System.SysUtils;
var
   myFloat: Single;
   myFormatSettings: TFormatSettings;
begin
   myFloat := 3.14;
   myFormatSettings := TFormatSettings.Create('en-us');

   Writeln( myFloat.ToString(myFormatSettings) );
end.


Besten Dank so funtkionierts.

Sir Rufo 2. Okt 2014 13:20

AW: Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
Ob Datenbank oder nicht, einen Wert speichert man niemals lokalisiert ab, sondern so, dass man den immer wieder korrekt lesen kann. Die Umwandlung mit einer Lokalisierung ist nur für die Anzeige.

Das berücksichtigen aber die Wenigsten und dann kommt es zu unschönen Effekten.

Der schöne Günther 2. Okt 2014 13:27

AW: Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
Vielleicht bin ich zu Java-geschädigt, aber ich hätte es besser gefunden wenn man den Anzeige-Fall zum Sonderfall gemacht hätte und nicht "Alles, außer Anzeige" zum Sonderfall in dem man mit FormatSettings jonglieren muss.

Also dass ein einfaches ToString() auf jedem System das gleiche ausgegeben hätte.

PS: Ist Boolean.ToString() eigentlich lokalisiert? :spin2:

himitsu 2. Okt 2014 13:42

AW: Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1274626)
PS: Ist Boolean.ToString() eigentlich lokalisiert? :spin2:

Es kommt drauf an, was die bei BoolToStr intern für Parameter verwenden (0 und 1 ist ja in jeder Sprache praktisch gleich)

Man kann ja die Anzeige als Sonderfall behandeln und gibt da überall das FormatSettings an und stellt im Gegenug das globale FormatSettings bei Programmstart auf Englisch um. (nicht vergessen die Ereignisbehandlung vom Delphi zu deaktivieren, denn das reagiert auf die ÄnderungsMessage des Systems und läd as FormatSettings dann neu)

Sir Rufo 2. Okt 2014 13:43

AW: Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
Da Delphi typsicher ist (einer der großen Vorteile) gibt es bei der Umwandlung von irgendeinem Typen in einen String ja nur die Anzeige oder in irgendeiner Formatierung.

Nun die Anzeige in der landestypischen Art ist dann eben der Default-Wert und alles andere muss man ja sowieso festlegen, weil man sicher sein muss, dass es in dem Format XY übergeben wird.

Der Weg von der Datenabfrage direkt in das Zielformat ist auch nicht das Gelbe vom Ei.

Eigentlich holt man sich aus einem Repository (dahinter liegt dann eine Datenbank, oder Datei, oder Web-Service oder die Oma oder ...) einen Wert (Record, Instanz, ...) und reicht den dann an eine Schnittstelle weiter, wo diese Daten dann für die konkrete Implementierung umgesetzt werden und zwar anhand der Schnittstellen-Regeln.

Dejan Vu 2. Okt 2014 13:52

AW: Float je nach Geräteeinstellung als String convertieren(Punkt oder Komma)
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1274618)
PS: Ich kenne mich ja mit Datenbanken eigentlich überhaupt nicht aus. Aber würde das "AsString" nicht die Umwandlung "Zahl -> String" an die Zugriffsschicht (oder etwa das DBMS selbst?) weiterschieben?

Nein nein, das macht dein Programm dann schon. Wäre ja blöd, wenn der Server in Indien steht und Du dann in Deutschland eine mit indischen Formatierungsregeln erstellte Anzeige bekämst.
Zitat:

Zitat von Sir Rufo (Beitrag 1274625)
Ob Datenbank oder nicht, einen Wert speichert man niemals lokalisiert ab...

Das steht imho nirgens, aber recht hast Du natürlich.

Der Fragesteller wollte nur, das die Zahlen in der Darstellung immer gleich sind. Sie scheinen als Zahl abgelegt worden zu sein. Hätte er den Fehler gemacht, die Zahl als String abzulegen, würde ja 'Field.AsString' immer das gleiche ergeben. Tuts aber nich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 Uhr.
Seite 1 von 2  1 2      

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