Delphiで数値の形式を国際化に対応する

Windowsでは地域の設定によって小数点や桁区切りの記号が異なります。
また利用者が自由に記号を変更することも可能です。

アプリケーションを国際化に対応する場合は、数値の形式を意識する必要があります。

先日、私が対応したときの方法を紹介します。
ポイントはFormat関数やStrToFloat関数などを使用するとき、引数にTFormatSettingsを与えることです。

アプリケーションでは、フォームに表示する時はコントロールパネルの「地域の設定」で設定されている小数点記号と桁区切り記号を使用し、ファイルに保存する時には小数点記号「.」桁区切り記号「,」とすることにしました。

type
  TForm1 = class(TForm)
  private
    /// <summary>コントロールパネルの「地域と言語の設定のオプション」の設定</summary>
    /// <remarks>フォームへの入出力に使用する</remarks>
    FLocalSettings: SysUtils.TFormatSettings;

    /// <summary>小数点記号「.」桁区切り記号「,」の設定</summary>
    /// <remarks>ファイルへの入出力に使用する</remarks>
    FGlobalSettings: SysUtils.TFormatSettings;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //コントロールパネルの「地域と言語の設定のオプション」の設定
  FLocalSettings := TFormatSettings.Create;

  //小数点記号「.」桁区切り記号「,」の設定
  FGlobalSettings := TFormatSettings.Create;
  FGlobalSettings.DecimalSeparator := '.';  //小数点記号
  FGlobalSettings.ThousandSeparator := ','; //桁区切り記号
end;

フォームに入力された数字を数値に変換する時には、StrToFloat関数を使用します。
このとき第二引数を指定し、コントロールパネルの「地域の設定」の書式で変換します。

var
  Value: double;
begin
   //コントロールパネルの「地域の設定」の書式で変換する。
  Value := StrToFloat(Edit1.Text, FLocalSettings);

数値を画面に表示する時はFormat関数を使用します。
このときに、コントロールパネルの「地域の設定」の書式で変換します。

Label1.Caption := Format('%n', [Value], FLocalSettings);

ファイルに保存する時には、小数点記号「.」桁区切り記号「,」で保存します。

S := Format('%n', [Value], FGlobalSettings);

ファイルから読み込む時も同じ要領になります。

次のサンプルプログラムでは、入力された値をEdit1に入力された値を、Label1にはコントロールパネルの「地域」設定で、Label2には小数点記号「.」桁区切り記号「,」で出力しています。
なお、コントロールパネルの「地域」の設定では、小数点の記号を「#」、桁区切り記号を「%」に変更しています。

procedure TForm1.Edit1Exit(Sender: TObject);
var
  Value: double;
begin
  Value := StrToFloat(Edit1.Text, FLocalSettings);

  Label1.Caption := Format('%n', [Value], FLocalSettings);
  Label2.Caption := Format('%n', [Value], FGlobalSettings);
end;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です