我正在寻找一种方法来读取存储在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页脚聚合不会格式化操作系统设置定义的负数。
答案 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;