2017-05-18 17 views
0

私のアプリケーションは、小数点区切り記号がカンマの地域設定のシステムで動作します。 (Delphi 10.1)デルファイの小数点記号の問題

私は自分のアプリケーションの小数点記号としてドットを設定しました。

Application.UpdateFormatSettings := false; 
    FormatSettings.DecimalSeparator := '.'; 
    Application.UpdateFormatSettings := true; 

これは問題なく機能します。

私はformat('%6.3f', 125.365])機能を使用しています。 エグゼは、フォーマット機能は、それが

言うコンマローカル設定の変更に小数点としてドットで正しくデータを返すが、後..システム上の24 * 7用に1又は2時間のような初期段階で

あります12,365

突然ドットがカンマに変わるのはなぜですか?

+1

[UpdateFormatSettingsのドキュメント](http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Forms.TApplication.UpdateFormatSettings)を見ましたか? *ユーザーがシステム構成を変更したときにフォーマット設定が自動的に更新されるかどうかを指定します* * False *のままにします。 –

+6

'FormatSettings'のグローバル設定に依存しないでください。プログラムのどの部分も設定を変更する可能性があります。スレッドセーフでもありません。あなた自身の 'FormatSettings'レコードを渡す、フォーマットされたフロートのオーバーロードされたバージョンを使用してください。 –

+0

また、フローを参照して、ユーザーに予想される形式で数字を表示させることもできます。 –

答えて

0

人があなたのものを混乱させたくない場合は、かき混ぜを使用してください。
この場合は、FormatSettingsレコードを受け入れるFormatのオーバーロードバージョンです。

はそうのような単位を作成します。

unit DecimalPoint; 

interface 

uses 
    System.SysUtils; 

var fs: TFormatSettings; 

implementation 
initialization 
    fs:= FormatSettings; 
    fs.ThousandSeparator:= ' '; <<-- don't forget 
    fs.DecimalSeparator:= '.' 
end. 

を、必要なusesにこのユニットを追加します。

今ので、同じようにそれを使用します。

Str:= Format('%6.3f', 125.365],fs); 
+0

レゴピースを一緒に糊付けするのをやめてください!(私はレゴランドで知っているが、彼らはあまりにもそれを行う)。 –

3

はグローバルFormatSettingsに依存しないでください。 Formatの2番目のオーバーロードを使用します。これにより、独自のTFormatSettingsを指定できます。

あなたは、Delphiの新しいバージョンを持っている場合は、あなたが直接TFormatSettings.Invariantを使用することができます。

S := Format('%6.3f', [125.365], TFormatSettings.Invariant) 

それとも、新しいTFormatSettingsを作成:

S := Format('%6.3f', [125.365], TFormatSettings.Create('en-US')); 

あるいは、例えばInvariantまたはCreateメソッドを持たないバージョンでは、もちろん「手で」の値を設定できます。しかし、あなた自身のFormatSettingsに設定してください。グローバルではありません。