Formatowanie liczb rzeczywistych — separator dziesiętny i tysięczny

0

Jak można sformatować liczbę rzeczywistą np.
1000 do postaci 1 000,000
Pozdrawiam !
Jak można klawiszem "ENTER " przjć z komponentu np. edit1 do edit2 na tym samym formularzu ?

6

https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.Format

Natomiats kolejność przechodzenia komponentów ustawia się property o nazwie TabOrder (w object inspectorze) i delphi samo Ci to ogarnia pod klawiszem TAB. Natomiast jak chcesz enter to niestety musisz już oprogramować OnKeyPress formy z ustawioną flagą KeyPreview := True;
No chyba, że ktoś zna sposób jak podmienić TAB na Enter w TabOrder :)

3

Jeżeli masz tylko kontrolki TEdit i wszystkie mają po naciśnięciu enter (gdy edit jest aktywny) przechodzić do następnego to coś takiego:


type
  TWinControlAtrapa =  class(TWinControl); //aby uzyskać dostep do chronionej metody SelectNext

  TEdit = class(Vcl.StdCtrls.TEdit) //jak chcesz  można wykorzystać zwyczajnie zdarzenie OnKeyUp
  protected
    procedure WMKeyUp(var Msg: TWMKeyUp); message WM_KEYUP;
  end;

//.....

implementation

{$R *.dfm}

procedure TEdit.WMKeyUp(var Msg: TWMKeyUp);
begin
  inherited;
  if Msg.CharCode = VK_RETURN then //czy enter
  begin
    TWinControlAtrapa(Self.Parent).SelectNext(Self, True, False); //przejdź do następnej kontrolki
    if (Screen.ActiveControl is TEdit) then //sprawdzasz czy aktywną kontrolką jest TEdit
      TEdit(Screen.ActiveControl).SetSelLength(0); //tu taka kosmetyka w tym wypadku pozbywam się zaznaczenia tekstu z kontrolki na ktorą przechodzi
  end;
end;
3
haryvincent176 napisał(a):

Jak można sformatować liczbę rzeczywistą np.
1000 do postaci 1 000,000

Funkcja Format z argumentem %n zrobi coś podobnego:

Format('%n', [Double(1000)]);  // 1,000.00

Niby działa, separatory są, ale wynik jest nieco inny od oczekiwanego — znaki separatorów się nie zgadzją, precyzja również. Aby naprawić precyzję i zwiększyć ją do trzech miejsc, należy ją określić w masce i ustawić sztywne 3 miejsca:

Format('%.3n', [Double(1000)]);  // 1,000.000

Domyślne znaki separatorów trzymane są w strukturze DefaultFormatSettings i to one są brane pod uwagę we wszystkich funkcjach konwertujących. Są zgodne z ustawieniami regionalnymi w systemie, dlatego na każdej maszynie mogą być inne — u mnie są takie jak podałem wyżej. Aby to zmienić, wystarczy albo zmodyfikować te znaki w domyślnej strukturze:

DefaultFormatSettings.DecimalSeparator := ',';
DefaultFormatSettings.ThousandSeparator := ' ';

Format('%.3n', [Double(1000)]);  // 1 000,000

albo użyć swojej i ją przekazać w parametrze funkcji konwertującej:

uses
  SysUtils;
var
  CustomSettings: TFormatSettings;
begin
  CustomSettings := DefaultFormatSettings;

  CustomSettings.DecimalSeparator := ',';
  CustomSettings.ThousandSeparator := ' ';

  Format('%.3n', [Double(1000)], CustomSettings);  // 1 000,000

W obu przypadkach wynikiem będzie to czego oczekujesz. To jeśli chodzi o Lazarusa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1