如何设置数据集的DisplayFormat以匹配Windows货币格式?

时间:2015-11-20 18:56:38

标签: delphi delphi-xe8

我正在寻找一种方法来读取存储在Windows中的默认货币相关格式信息并构建格式字符串,包括负数的格式,我可以将其用作数据集字段的DisplayFormat。

例如,在C#中有格式" C"货币(见Standard Numeric Format Strings)。

例如(我在linqpad中运行):

String.Format("{0:C}", -120)

打印($120.00),与我的Windows设置匹配。

在Delphi中,我需要一个查看TFormatSettings属性并构建货币格式字符串的函数,如下所示:$,0.00;($,0.00)(我使用英语 - 美国默认设置)。

我试图在DevExpress量子网格中解决一个问题,其中带有货币值的列的SUM页脚聚合不会格式化操作系统设置定义的负数。

1 个答案:

答案 0 :(得分:0)

我最终使用下面的代码。前两个函数来自data \ Data.FMTBcd.pas。

如果我在控制面板中更改十进制符号或数字分组符号,我注意到做了一些测试的一件事 - >地区和语言 - >其他设置 - > “货币”选项卡,TFormatSettings不会读取这些新值,它始终将点作为小数点分隔符返回,将逗号作为千位分隔符返回。相反,它使用Numbers选项卡中的这些设置。

function AddCurrencySymbol(const Value, CurrSymbol: string; const CurrFormat: Byte): string;
begin
  case CurrFormat of
    0: Result := Format('%s%s', [CurrSymbol, Value]);
    1: Result := Format('%s%s', [Value, CurrSymbol]);
    2: Result := Format('%s %s', [CurrSymbol, Value]);
    3: Result := Format('%s %s', [Value, CurrSymbol]);
  end;
end;

{   0 = '($1)'      4 = '(1$)'      8 = '-1 $'      12 = '$ -1'
    1 = '-$1'       5 = '-1$'       9 = '-$ 1'      13 = '1- $'
    2 = '$-1'       6 = '1-$'      10 = '1 $-'      14 = '($ 1)'
    3 = '$1-'       7 = '1$-'      11 = '$ 1-'      15 = '(1 $)'  }
function AddNegCurrencySymbol(const Value, CurrSymbol: string; const CurrFormat: Byte): string;
begin
  case CurrFormat of
    0: Result := Format('(%s%s)', [CurrSymbol, Value]);
    1: Result := Format('-%s%s', [CurrSymbol, Value]);
    2: Result := Format('%s-%s', [CurrSymbol, Value]);
    3: Result := Format('%s%s-', [CurrSymbol, Value]);
    4: Result := Format('(%s%s)', [Value, CurrSymbol]);
    5: Result := Format('-%s%s', [Value, CurrSymbol]);
    6: Result := Format('%s-%s', [Value, CurrSymbol]);
    7: Result := Format('%s%s-', [Value, CurrSymbol]);
    8: Result := Format('-%s %s', [Value, CurrSymbol]);
    9: Result := Format('-%s %s', [CurrSymbol, Value]);
   10: Result := Format('%s %s-', [Value, CurrSymbol]);
   11: Result := Format('%s %s-', [CurrSymbol, Value]);
   12: Result := Format('%s %s', [CurrSymbol, Value]);
   13: Result := Format('%s -%s', [Value, CurrSymbol]);
   14: Result := Format('(%s- %s)', [CurrSymbol, Value]);
   15: Result := Format('(%s %s)', [Value, CurrSymbol]);
  end;
end;

function DefaultCurrencyFormat(formatSettings: TFormatSettings): String;
begin

 if formatSettings.CurrencyDecimals > 0 then
   Result := '0' + formatSettings.DecimalSeparator + StringOfChar('0', formatSettings.CurrencyDecimals)
 else
   Result := '0';

 Result := formatSettings.ThousandSeparator + Result;

 Result := AddCurrencySymbol(Result, formatSettings.CurrencyString, formatSettings.CurrencyFormat)
        + ';' + AddNegCurrencySymbol(Result, formatSettings.CurrencyString, formatSettings.NegCurrFormat)

end;