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;