AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fehler bei StrToFloat(StrAlsIntegerFormatiert)
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei StrToFloat(StrAlsIntegerFormatiert)

Ein Thema von newgro · begonnen am 16. Apr 2007 · letzter Beitrag vom 17. Apr 2007
Antwort Antwort
Seite 3 von 3     123   
newgro

Registriert seit: 26. Mär 2007
53 Beiträge
 
Delphi 2006 Professional
 
#21

Re: Fehler bei StrToFloat(StrAlsIntegerFormatiert)

  Alt 16. Apr 2007, 17:27
Dies ist der Testfall. Und der geht auch wieder nicht. So langsam denke ich an Selbstmord (
Delphi-Quellcode:
procedure TestTfrm_budgets.TestgetFormatted1;
var
  ReturnValue: Real;
  decPlaces: Integer;
  value: string;
begin
  value:='1.000,00';
  ReturnValue := getFormatted(value, decPlaces);
  Assert(ReturnValue=1000.00, 'Oops');
end;

function TestTfrm_budgets.getFormatted(value: String; decPlaces: Integer): Real;
var toFormat: Real;
    str: String;
begin
  if value = 'then
    toFormat:= 0
  else begin
    str:= StringReplace(value, '.', '', [rfReplaceAll]);
    toFormat:= StrToFloat(value);
  end;
  result:=StrToFloat(format('%.' + IntToStr(decPlaces) + 'n', [toFormat]));
end;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#22

Re: Fehler bei StrToFloat(StrAlsIntegerFormatiert)

  Alt 16. Apr 2007, 17:55
Du mußt auch den String verwenden, in welchem du ersetzt hast:
Delphi-Quellcode:
str:= StringReplace(value, '.', '', [rfReplaceAll]);
toFormat:= StrToFloat(str);
Markus Kinzler
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#23

Re: Fehler bei StrToFloat(StrAlsIntegerFormatiert)

  Alt 16. Apr 2007, 18:04
Delphi-Quellcode:
function TestTfrm_budgets.getFormatted(value: String; decPlaces: Integer): Real;
var toFormat: Integer;
    str: String;
begin
  if value = 'then
    toFormat:= 0
  else begin
    str:= StringReplace(value, '.', '', [rfReplaceAll]);
    toFormat:= StrToFloat(str); // <---- str anstelle von value
  end;
  result:=toFormat*power(10,(decplaces*-1));
end;
Nur solltest Du noch sehen, das wenn Du alle Punkte (.) mit StringReplace löscht
Du ein Problem bekommen könntest wenn Dein Programm auf einem englischen OS mit den englischen
Ländereinstellungen läuft.
Wenn Du aus der DB sowieso nur Ganzzahlwerte ausliest und die Nachkommastelle getrennt geliefert
bekommst, wäre es vielleicht sinnvoller den value mit StrToInt umzuwandeln.

Delphi-Quellcode:
var toFormat: Integer;
..
toFormat:= StrToInt(str);
[edit] sorry mkinzler, hatte Dich übersehen [/edit]

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
newgro

Registriert seit: 26. Mär 2007
53 Beiträge
 
Delphi 2006 Professional
 
#24

Re: Fehler bei StrToFloat(StrAlsIntegerFormatiert)

  Alt 17. Apr 2007, 09:13
Arggghhh.

toFormat:= StrToFloat(str); // <---- str anstelle von value Danke Euch beiden. Ja ja der Wald und die Bäume

@Klaus: In der DB sind die Felder value:Real und decPlaces:Integer. Die NKS werden nur für die Ausgabe genutzt.
Also: value = 1000,00 und NKS = 0 dann Ausgabe 1000 | value = 1000,00 und NKS = 4 dann Ausgabe 1000,0000

Was ich mich frage ist, wieso ich den f.ThousandSeparator nicht nutzen kann. Dann wäre doch das Locale-Problem (en, de) gelöst.
Aber leider kommt bei StringReplace(str, f.ThousandSeparator, '', [rfReplaceAll]) trotzdem wieder der ungültige Gleitkommawert raus.

Und als nächstes frage ich mich, warum das hier wieder nicht geht
result:= StrToFloat(format('%.' + IntToStr(decPlaces) + 'n', [toFormat])); Ich benutze hier eine gültige Formatfunktion und will den Wert zurückwandeln. Sollte das nicht gehen?

Danke
Per
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#25

Re: Fehler bei StrToFloat(StrAlsIntegerFormatiert)

  Alt 17. Apr 2007, 09:27
Zitat von newgro:
[delphi]
@Klaus: In der DB sind die Felder value:Real und decPlaces:Integer. Die NKS werden nur für die Ausgabe genutzt.
Also: value = 1000,00 und NKS = 0 dann Ausgabe 1000 | value = 1000,00 und NKS = 4 dann Ausgabe 1000,0000
Guten Morgen Per,

mal eine etwas blöde Frage, was bringt es Dir wenn in value ein Wert von 12345,23 steht und NKS=4
hat dann auf ein Ergebnis zu kommen das da lautet 12345,2300 welches eigentlich keine Mehrinformation bietet
als 12345,23 - oder ?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
newgro

Registriert seit: 26. Mär 2007
53 Beiträge
 
Delphi 2006 Professional
 
#26

Re: Fehler bei StrToFloat(StrAlsIntegerFormatiert)

  Alt 17. Apr 2007, 09:31
Morgen Klaus,

jep. Aber wenn Du anfängst Summen zu bilden über Werte mit unterschiedlichen NKS ist das notwendig.
So bietet zwar 123.5600 keine Mehrinfos. Wohl aber value:123.5600 + value1:125.8979

Ich habe mir das ja auch nicht ausgedacht Ist halt eine Anforderung von meinem Chef
  Mit Zitat antworten Zitat
newgro

Registriert seit: 26. Mär 2007
53 Beiträge
 
Delphi 2006 Professional
 
#27

Re: Fehler bei StrToFloat(StrAlsIntegerFormatiert)

  Alt 17. Apr 2007, 09:44
OK, das Problem mit dem f.ThousandSeparator habe ich jetzt gelöst. Ich kann ihn verwenden, wenn ich f: TFormatSettings initialisiert habe
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, f); Bleibt noch die Frage mit dem StrToFloat(formatierterString)

Cheers
Per
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#28

Re: Fehler bei StrToFloat(StrAlsIntegerFormatiert)

  Alt 17. Apr 2007, 10:36
result:= StrToFloat(format('%.' + IntToStr(decPlaces) + 'n', [toFormat])); Wenn Du toFormat mit n formatierst werden wieder Tausendertrennzeichen in den String eingeführ.
StrToFloat mag aber keine Tausendertrennzeichen.
Wenn Du hier die Nachkommastellen haben willst,machen die nur als String einen Sinn,
denn wenn Du das ganze wieder in einen Floatwert konvertierst ist die Angabe von Nachkommastellen
relativ zweckfrei. Die Realwerte haben nur soviele Nachkommastellen wie nötig sind.

result:= StrToFloat(format('%.' + IntToStr(decPlaces) + 'f', [toFormat])); [/delphi]
Ist unsinning, kürzer ist result:=toFormat; und kommt auf das gleiche heraus.

Die getrennte Angabe von Nachkommastellen in der DB macht für mich nur Sinn wenn value ein Integerwert ist.
Floats werden in der DB wohl mit der richtigen Nachkommastellenanzahl gespeichert.
Vielleicht macht es noch Sinn um die Maximale Nachkommastellenanzahl zu begrenzen,
dann würde aus 123456,33333333 mit NKS=4 -> 123456,3333 -> was aber die Rechengenauigkeit einschränckt.

Deswegen würde ich runden, wenn das Gesamtergebnis präsentiert werden soll und nicht schon beim Einlesen
der einzelnen Werte.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
newgro

Registriert seit: 26. Mär 2007
53 Beiträge
 
Delphi 2006 Professional
 
#29

Re: Fehler bei StrToFloat(StrAlsIntegerFormatiert)

  Alt 17. Apr 2007, 12:00
Danke für die ausführliche Erklärung.

Also mal kurz zu dem Format der Daten in der DB.

Ich habe in einer DB-Tabelle Monatswerte:Real für Umsatz und Mitarbeiter und und und.
Die werden leider mal als 12 - oder 12,9 oder 12,987 eingetragen.
Nun soll der Umsatz mit N Stellen nach dem Komma und die Mitarbeiter als "Pseudo-Integer"
ohne NKS dargestellt werden. Dafür ist der ganze Aufwand.

Ok nach langem hin und her habe ich jetzt folgende Lösung, die soweit zu funktionieren scheint
Delphi-Quellcode:
{
  Format a real value with decimal places
  @param value the real to format
  @param decPlaces the decimal places to set
  @return String the formatted value
}

function Tfrm.getFormatted(value: Real; decPlaces: Integer): String;
begin
  result:=format('%.' + IntToStr(decPlaces) + 'n', [value]);
end;

{
  Get a float from a string
  @param value the string to convert
  @return Real the value
}

function Tfrm.getFloat(value: String): Real;
var str: String;
    f: TFormatSettings;
begin
  if value = 'then
    result:= 0
  else begin
    GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, f);
    str:= StringReplace(value, f.ThousandSeparator, '', [rfReplaceAll]);
    result:= StrToFloat(str);
  end;
end;
Danke nochmal an alle die an der Lösung mitgeholfen haben.
Cheers
Per
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 19:48 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