AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TJSONValue und Dezimalzahlen

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

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.435 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

TJSONValue und Dezimalzahlen

  Alt 13. Jul 2018, 16: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 manchmal Löcher in der Wand dahinter.
  Mit Zitat antworten Zitat
Der schöne Günther
Online

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

AW: TJSONValue und Dezimalzahlen

  Alt 13. Jul 2018, 16: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
Online

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.435 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: TJSONValue und Dezimalzahlen

  Alt 13. Jul 2018, 17: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 manchmal Löcher in der Wand dahinter.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter
Online

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.435 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: TJSONValue und Dezimalzahlen

  Alt Gestern, 07: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 manchmal Löcher in der Wand dahinter.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
5.798 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#5

AW: TJSONValue und Dezimalzahlen

  Alt Gestern, 09: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
Online

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.435 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: TJSONValue und Dezimalzahlen

  Alt Gestern, 09: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 manchmal Löcher in der Wand dahinter.
  Mit Zitat antworten Zitat
Der schöne Günther
Online

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

AW: TJSONValue und Dezimalzahlen

  Alt Gestern, 09: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
34.637 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: TJSONValue und Dezimalzahlen

  Alt Gestern, 09: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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter
Online

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.435 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: TJSONValue und Dezimalzahlen

  Alt Heute, 07: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 manchmal Löcher in der Wand dahinter.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.637 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: TJSONValue und Dezimalzahlen

  Alt Heute, 09: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (Heute um 09:48 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2018 by Daniel R. Wolf