Tausendertrennzeichen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Tausendertrennzeichen

Beitrag von Andromeda »

Hallo,

gibt es eine Funktion, mit der ich das Tausendertrennzeichen entfernen kann, unabhängig davon, ob es nun ein Punkt oder ein Komma ist?

Ich möchte also sowohl aus 1.250,00, wie auch aus 1,250.00 das Ergebnis 1250,00 erhalten.

Vielen Dank im Voraus

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6780
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Tausendertrennzeichen

Beitrag von af0815 »

Sowas ?

Code: Alles auswählen

function StrFormat2StrFormat(SourceStr: string; SourceFormat: TFormatSettings;
                             out DestStr: string; DestFormat: TFormatSettings):boolean;
var
    Temp: Extended;
begin
  if SourceStr = '' then
  begin
    Result:= false;
    exit;
  end;
  try
    TryStrToFloat(SourceStr, Temp, SourceFormat);
    DestStr:=FloatToStr(Temp,DestFormat);
  except
    Result:=false;
  end;
end;    
Verwendung in etwa so

Code: Alles auswählen

 
var
  SourceFSettings,DestFSettings: TFormatSettings;
 
begin
  {some code}
  SourceFSettings:=FormatSettings;
  SourceFSettings.DecimalSeparator:=',';
  SourceFSettings.ThousandSeparator:='.';
  DestFSettings:=FormatSettings;
  DestFSettings.DecimalSeparator:='.';
  DestFSettings.ThousandSeparator:=' ';
  {some code}
  StrFormat2StrFormat(strInput,SourceFSettings,strTemp,DestFSettings);
 
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Tausendertrennzeichen

Beitrag von Andromeda »

Vielen Dank für den Code,

aber leider ist das wohl etwas zu hoch für mich.

Angenommen, ich habe ein Edit, einen Button und ein Label. Wie muss ich denn dann die Prozedur schreiben, damit im Label der Text aus dem Edit ohne die Tausendertrennzeichen ausgegeben wird?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Tausendertrennzeichen

Beitrag von Michl »

Normalerweise kann man sich je nach Einstellung vom System das Tausendertrennzeichen angeben lassen. Das funktioniert über DefaultFormatSettings. Je nach Einstellung wird für DefaultFormatSettings.ThousandSeparator ein ',' oder '.' zurückgeliefert.

Eine Lösung ja nach Land bzw. System könnte so aussehen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
begin
  s := '1.234.567,89';  
//  s := '1,234,567.89';  
  Edit1.Text := StringReplace(s, DefaultFormatSettings.ThousandSeparator , '', [rfReplaceAll]);
end; 
Willst du wirklich beide Systeme zur gleichen Zeit auf einem Rechner unterstützen, musst du etwas basteln, wobei du bei 1.234 eine Entscheidung treffen musst, ob es dann 1.234 oder 1,234 ist. Ein Fehlerrisiko würde somit immer bleiben. Ich persönlich würde da auf die DefaultFormatSettings setzen und notfalls einen Hinweis ausgeben.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6780
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Tausendertrennzeichen

Beitrag von af0815 »

Andromeda hat geschrieben:aber leider ist das wohl etwas zu hoch für mich.
Für mich auch. Beim Erstellen eines Testprojektes für dich, bin ich auf interessante Probleme gestoßen.
Zitat:

Code: Alles auswählen

//ThousandSeparator not allowed as by Delphi specs 
Quelle: fpc\rtl\objpas\sysutils\sysstr.inc Zeile 1031

Deshalb wirft die oben gezeigte Funktion einen Fehler beim Aufruf von TryStrToFloat(SourceStr, Temp, SourceFormat); eine Exception.

Ich sehe momentan somit auch keine Lösung, ich weiß aber, das in meiner eigenen Bibliothek ein Problem schlummert :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Tausendertrennzeichen

Beitrag von Michl »

af0815 hat geschrieben:Deshalb wirft die oben gezeigte Funktion einen Fehler beim Aufruf von TryStrToFloat(SourceStr, Temp, SourceFormat); eine Exception.

Ich sehe momentan somit auch keine Lösung, ich weiß aber, das in meiner eigenen Bibliothek ein Problem schlummert :-)
Du musst die Tausender rausschmeißen. Das hat man wohl von Delphi übernommen?! Zitat: Thousand separators and currency symbols are not allowed in the string.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Tausendertrennzeichen

Beitrag von Andromeda »

Vielen Dank an Alle,

ich habe das Problem jetzt so gelöst, dass ich das drittletzte Zeichen abfrage. Wenn das ein Komma ist, werden alle Punkte entfernt, und wenn das ein Punkt ist, werden die Kommas entfernt und der Punkt in ein Komma umgewandelt.

Das ist vielleicht etwas umständlich, aber mit meinen Kenntnissen bekomme ich es nicht besser hin. Die Zeit spielt ja bei Tastaturabfragen sowieso keine Rolle. Auf jeden Fall funktioniert es jetzt einwandfrei.

Antworten