如何在左边显示减号(Delphi,TListview)
How to display minus on the left (Delphi, TListview)
我正在尝试在 TListview
中的项目左侧显示负数的减号,该项目具有他的 属性 BiDiMode = bdRightToLeft.
我试过那里的代码:
Function TfrmProjets.IfSign(floatValue: double; howMuchDecimalAfterComa:
integer):string;
var
strResult: string;
strZero: string;
i: integer;
begin
strResult := '';
strZero := '';
for i := 0 to howMuchDecimalAfterComa -1 do
begin
strZero := strZero + '0';
end;
if(Sign(floatValue) = NegativeValue)then
begin
strResult := '-' + FormatFloat('0.' + strZero,Abs(floatValue));
//strResult := '(' + FormatFloat('0.' + strZero,Abs(floatValue)) + ')';
end
else
begin
strResult := FormatFloat('0.' + strZero,floatValue);
end;
result := strResult;
end;
事实上,当我使用断点来计算 strResult
时它起作用了。
但是当TListView
显示在我的项目中时:
lvItem := lvPeriodic[0];
lvItem.SubItems.Add(IfSign(-14.2),1) + '%') ;
显示如下:14.2%-
有没有办法告诉 TListview
不要更改我正在显示的字符串或其他内容?
假设您使用的是 delphi 的 unicode 版本,您可以提供明确的 RTL 和 LTR 标记来强制定位语言中性或弱字符(如破折号 -
、感叹号 !
,等等)。
在各种上下文中解析 LTR 和 RTL 文本的规则广泛而复杂。作为参考,您可以找到 bidirectional algorithm specification here。弱字符的一次传递确实将欧洲数字解析为 LTR(这就是为什么 14.2%
以正确的方向结束,但是使用破折号 -
来表示减号会引入歧义。人们会认为用正确的减号 U+2212
会起作用,但这也是一个弱字符,大概是因为阿拉伯数字也可以是负数(并且需要在相反的方向呈现......我不确定)。
无论如何 - 继续,我们可以构造一个像这样的函数来强制字符串进入严格的 LTR 顺序:
function StrictLTR(const s : string) : string;
const
LTR_EMBED = Char(2A);
POP_DIRECTIONAL = Char(2C);
begin
result := LTR_EMBED + s + POP_DIRECTIONAL;
end;
这会在字符串之前放置一个嵌入的从左到右字符 (U+202A
),并在其后跟一个 Pop-Directional-Formatting (U+202C
) 字符。后者删除了嵌入的方向格式提示和 returns 文本方向到先前上下文中的任何内容。因此,返回的字符串可以安全地用于 RTL 或 LTR 上下文。
调用这个,然后:
ListView1.AddItem(StrictLTR(IfSign(-14.2,1) + '%'), nil);
将产生预期的结果。
顺便说一句,使用 Format
函数可以大大简化您的 IfSign
函数:
Function IfSign(floatValue: double; numberOfDecimalPlaces:integer):string;
begin
result := Format('%.'+IntTostr(numberOfDecimalPlaces)+'f', [floatValue]);
end;
我正在尝试在 TListview
中的项目左侧显示负数的减号,该项目具有他的 属性 BiDiMode = bdRightToLeft.
我试过那里的代码:
Function TfrmProjets.IfSign(floatValue: double; howMuchDecimalAfterComa:
integer):string;
var
strResult: string;
strZero: string;
i: integer;
begin
strResult := '';
strZero := '';
for i := 0 to howMuchDecimalAfterComa -1 do
begin
strZero := strZero + '0';
end;
if(Sign(floatValue) = NegativeValue)then
begin
strResult := '-' + FormatFloat('0.' + strZero,Abs(floatValue));
//strResult := '(' + FormatFloat('0.' + strZero,Abs(floatValue)) + ')';
end
else
begin
strResult := FormatFloat('0.' + strZero,floatValue);
end;
result := strResult;
end;
事实上,当我使用断点来计算 strResult
时它起作用了。
但是当TListView
显示在我的项目中时:
lvItem := lvPeriodic[0];
lvItem.SubItems.Add(IfSign(-14.2),1) + '%') ;
显示如下:14.2%-
有没有办法告诉 TListview
不要更改我正在显示的字符串或其他内容?
假设您使用的是 delphi 的 unicode 版本,您可以提供明确的 RTL 和 LTR 标记来强制定位语言中性或弱字符(如破折号 -
、感叹号 !
,等等)。
在各种上下文中解析 LTR 和 RTL 文本的规则广泛而复杂。作为参考,您可以找到 bidirectional algorithm specification here。弱字符的一次传递确实将欧洲数字解析为 LTR(这就是为什么 14.2%
以正确的方向结束,但是使用破折号 -
来表示减号会引入歧义。人们会认为用正确的减号 U+2212
会起作用,但这也是一个弱字符,大概是因为阿拉伯数字也可以是负数(并且需要在相反的方向呈现......我不确定)。
无论如何 - 继续,我们可以构造一个像这样的函数来强制字符串进入严格的 LTR 顺序:
function StrictLTR(const s : string) : string;
const
LTR_EMBED = Char(2A);
POP_DIRECTIONAL = Char(2C);
begin
result := LTR_EMBED + s + POP_DIRECTIONAL;
end;
这会在字符串之前放置一个嵌入的从左到右字符 (U+202A
),并在其后跟一个 Pop-Directional-Formatting (U+202C
) 字符。后者删除了嵌入的方向格式提示和 returns 文本方向到先前上下文中的任何内容。因此,返回的字符串可以安全地用于 RTL 或 LTR 上下文。
调用这个,然后:
ListView1.AddItem(StrictLTR(IfSign(-14.2,1) + '%'), nil);
将产生预期的结果。
顺便说一句,使用 Format
函数可以大大简化您的 IfSign
函数:
Function IfSign(floatValue: double; numberOfDecimalPlaces:integer):string;
begin
result := Format('%.'+IntTostr(numberOfDecimalPlaces)+'f', [floatValue]);
end;