2017-08-19 4 views
-1

私は、DataSnapとTetheringを使用してDelphiでサービスを開発しており、接続されたクライアントに情報を送ります。さて、フィールドのいくつかは、 "FormatFloat( '$、0 ###'、field)という関数を使って文字列に変換すると浮動小数点になります。それは私に別のフォーマットを与えます。つまり、フォーマットI Windowsで設定されています。 "千単位の区切り記号と小数点の "、"は反対ですが。私は15674.45を$ 15,647.45でなく$ 15.647,45にしたいと思います。しかし、私はフォーマットを強制したくありません。 DelphiのバージョンではDelphiで開発されたサービスでのフロート変換

procedure TServerContainerSGV40.tapServicioResourceReceived(const Sender: TObject; const AResource: TRemoteResource); 
var 
    identifier, hint, cadena: string; 
    ID_PRODUCTO: Integer; 
    codigo, descripcion: string; 
    ppp, stock, precio_venta: Real; 
begin 
    if AResource.ResType = TRemoteResourceType.Data then 
    begin 
    identifier := Copy(AResource.Hint, 1, Pos('}', AResource.Hint)); 
    hint := AResource.Hint.Replace(identifier, ''); 
    cadena := AResource.Value.AsString; 
    if cadena = 'Get IP' then EnviarCadena(AResource.Hint, 'Envío IP', GetLocalIP); 
    if hint = 'Datos Producto' then 
    begin 
     if cadena.Length > 0 then 
     begin 
     with usGetDatosProducto do 
     begin 
      ParamByName('CODIGO').AsString := cadena; 
      Execute; 
      ID_PRODUCTO := ParamByName('ID_PRODUCTO').AsInteger; 
      codigo := ParamByName('CODIGO').AsString; 
      descripcion := ParamByName('DESCRIPCION').AsString; 
      ppp := ParamByName('PPP').AsFloat; 
      stock := ParamByName('STOCK').AsFloat; 
      precio_venta := ParamByName('PRECIO_VENTA').AsFloat; 
     end; 
     if ID_PRODUCTO > 0 then 
     begin 
      cadena := Format('%s;%s;;PRECIO:'#9'%s;P.P.P.:'#9'%s;STOCK:'#9'%s', [ 
      codigo, descripcion, FormatFloat('$ ,0', precio_venta), 
      FormatFloat('$ ,0.##', ppp), FormatFloat(',0.###', stock) 
      ]); 
      EnviarCadena(identifier, 'Envío Datos Producto', cadena); 
     end 
     else 
      EnviarCadena(identifier, 'Mostrar Mensaje', 'Código de Producto No Existe'); 
     end; 
    end; 
    end; 
end; 
+0

タグスパムを停止してください。あなたの質問は、テザリング、データスナップ、またはサービスとはまったく関係ありません。これは、浮動小数点数をローカライズされた通貨文字列にフォーマットすることに関するものです。あなたがサービスでそうしているという事実は、サービスプログラミングに関する質問をしません。テザリングとDataSnapの両方が、テザリングやDataSnapプログラミングに関する質問をしないと言及しています。タグはここでは関連性と意味を持ちます。あなたの質問に実際に当てはまるものだけを適用してください。ありがとう。 –

+0

私はこのフォーマットが欲しいですが、私はそれを強制したくありません。エル、何?あなたは特定のフォーマットをしたいのですか?とにかく、書式設定通貨は、ユーザーに表示されるべきものです。舞台裏のデータ転送のためではありません。データを転送するときに通貨をフォーマットしないでください。ディスプレイ上でのみフォーマットしてください。 –

答えて

2

D2009から(少なくとも)あなたは、特定の操作のためにspecify format settingsとWindowsのデフォルト設定によって、あるいは必要に応じて書式設定フィールドを変更のいずれか、これらの設定を初期化することができます。

function FormatFloat(const Format: string; Value: Extended): string; overload; 
function FormatFloat(const Format: string; Value: Extended; 
        const FormatSettings: TFormatSettings): string; overload; 

そして、私は疑問に思う - それは唯一のFormat機能を持つすべての文字列を形成することができませんか?あなたは関係なく、OSの設定の特定の形式を強制したい場合は

FormatFloat('$#,##0.00', field); 

は、使用します。デフォルトでは

+0

助けてくれてありがとう、それは完全に動作します。 –

3

は、FormatFloat()は、プログラムの起動時にOSの設定からを初期化されるグローバルSysUtils.ThousandsSeparatorSysUtils.DecimalSeparator変数を、使用しています入力としてTFormatSettingsを取るFormatFloat()のオーバーロードされたバージョン:

var 
    fmt: TFormatSettings; 

fmt := TFormatSettings.Create; 
fmt.ThousandsSeparator := '.'; 
fmt.DecimalSeparator := ','; 
FormatFloat('$#,##0.00', field, fmt); 
+0

TFormatSettingsはレコードタイプではありませんか?最近のdelphiのバージョンでその変更があったのですか、何か不足していますか? –

+0

@JohnEasley:はい、それはレコードであり、いつもされています。しかし、OSからのデフォルト値でレコードを初期化するための 'Create'メソッド(コンストラクタ)もあります。 –

+0

助けてくれてありがとう、それは完全に動作します。 –

関連する問題