AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TJSONValue und Dezimalzahlen

Ein Thema von Codehunter · begonnen am 13. Jul 2018 · letzter Beitrag vom 17. Jul 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

TJSONValue und Dezimalzahlen

  Alt 13. Jul 2018, 17:12
Delphi-Version: 10.2 Tokyo
Hallo!

Ich habe einen JSON-String mit einer Dezimalzahl, die ich in ihrer String-Representation auslesen will. Dummerweise passiert da eine Typumwandlung auf Ebene der Systemeinstellungen:
Code:
{
  "key":123.4
}
Ergibt bei (TJSONValue as TJSONString).Value eine ungültige Typumwandlung und bei (TJSONValue as TJSONNumber).ToString den Wert "123,40"

Ich möchte aber die Originalschreibweise, so wie im JSON notiert, also "123.4".

Vielleicht ist die Woche schon zu alt, der Freitag zu lang, wie auch immer, ich steh auf dem Schlauch

Grüße
Cody
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: TJSONValue und Dezimalzahlen

  Alt 13. Jul 2018, 17:40
und bei (TJSONValue as TJSONNumber).ToString den Wert "123,40"
Also bei mir kommt 1:1 raus was im Json steht. Delphi 10 Seattle.
Delphi-Quellcode:
procedure p();
const
   input = '{"key":123.4}';
var
   jsonObject: TJSONObject;
   jsonNumber: TJSONNumber;
begin
   jsonObject := TJsonObject.ParseJSONValue(input) as TJSONObject;
   jsonNumber := jsonObject.Values['key'] as TJSONNumber;
   WriteLn( jsonNumber.ToString() ); // Ergibt "123.4"
end;
Beinhaltet dein "Originalschreibweise" auch dass eine "123.4000" nicht als "123.4" ausgegeben werden darf?
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TJSONValue und Dezimalzahlen

  Alt 13. Jul 2018, 18:42
Ja das dachte ich auch. Aber scheinbar spielen da auch Regionaleinstellungen mit rein. Worauf ich hinaus will ist sozusagen eine Raw-String-Representation des Wertes. Im Grunde bräuchte ich etwas das gar nicht erst eine Typumwandlung macht.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TJSONValue und Dezimalzahlen

  Alt 16. Jul 2018, 08:28
Nachtrag:
Beinhaltet dein "Originalschreibweise" auch dass eine "123.4000" nicht als "123.4" ausgegeben werden darf?
Ja, ganz genau so! Wenns als "123.4000" notiert ist, brauche ich einen String der "123.4000" enthält.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

AW: TJSONValue und Dezimalzahlen

  Alt 16. Jul 2018, 10:03
Zeig doch mal etwas mehr Code. Mit dem obigen Beispiel bekomme ich hier ebenfalls den korrekten String raus, obwohl der DecimalSeparator ein Komma ist. Ich vermute, daß die Umwandlung an einer anderen Stelle passiert.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TJSONValue und Dezimalzahlen

  Alt 16. Jul 2018, 10:23
Du hast völlig recht Uwe. Der Fehler war, dass ich TJSONValue vor dem .ToString zu einer TJSONNumber gecastet habe.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: TJSONValue und Dezimalzahlen

  Alt 16. Jul 2018, 10:24
So ungefähr?

Delphi-Quellcode:
type
   TJsonObjectHelper = class helper for System.JSON.TJSONObject
      function FindPair(const PairName: String): TJSONPair;
   end;

procedure p();
const
   input = '{"key": 123.400}';
var
   jsonObject: TJSONObject;
   jsonPair: TJSONPair;
begin
   jsonObject := TJsonObject.ParseJSONValue(input) as TJSONObject;
   try
      jsonPair := jsonObject.FindPair('key');
      WriteLn( jsonPair.JsonValue.ToString() ); // Ergibt "123.400"
   finally
      jsonObject.Destroy();
   end;
end;

{ TJsonObjectHelper }

function TJsonObjectHelper.FindPair(const PairName: String): TJSONPair;
var
  Candidate: TJSONPair;
  I: Integer;
begin
  for I := 0 to Count - 1 do
  begin
   Candidate := TJSONPair(self.FMembers[I]);
   if (Candidate.JsonString.Value = PairName) then
   begin
     Exit(Candidate);
   end;
  end;
  Result := nil;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: TJSONValue und Dezimalzahlen

  Alt 16. Jul 2018, 10:30
Warum liest du das dann nicht einfach als Zahl (Float) aus und konvertierst selber?

Ansonsten geht es halt über die globalen FormatStettings.
Lösung: Stell dein Windows auf englisch um und schon hast du deine 123.4
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TJSONValue und Dezimalzahlen

  Alt 17. Jul 2018, 08:05
Warum liest du das dann nicht einfach als Zahl (Float) aus und konvertierst selber?
Dass die Anforderung überhaupt besteht ergibt sich aus der verqueren Schnittstellenspezifikation. Mehrere Felder haben kontextabhängig unterschiedliche Anzahl Dezimalstellen und bei Antworten bestehen sie auch auf ebensolche, selbst wenn 123.000000 zurückgegeben werden muss. FormatSettings kann ich also nicht hardcoded verwenden
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: TJSONValue und Dezimalzahlen

  Alt 17. Jul 2018, 10:44
Wenn, dann müssen sie die Zahlen eben als String speichern und nicht als Float.
Alles andere wiederspricht grob fahrlässig der Spezifikation des JSON.

Wenn der Nummeric-Typ den Wert nunmal auch Nummerisch speichert, dann gehen beim Einlesen automatisch sämtliche Informationen über führende/folgende Nullen verloren.
Kein "ordentlicher" JSON-Parser/Konverter wird sowas ohne Informationsverlust einlesen und schon garnicht speichern können.
Fazit: Du mußt den ganzen JSON-String selbst parsen und behandeln.
$2B or not $2B

Geändert von himitsu (17. Jul 2018 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr.
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