我试图在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
不要更改我正在显示的字符串?
答案 0 :(得分:4)
假设您使用的是unicode版本的delphi,您可以提供显式RTL和LTR标记来强制语言中性或弱字符(如短语-
,感叹号!
等)的位置。
在各种上下文中解析LTR和RTL文本的规则是广泛而复杂的。作为参考,您可以找到bidirectional algorithm specification here。弱字符的一次传递会将欧洲数字解析为LTR(这就是14.2%
以正确方向结束的原因,但使用短划线-
来表示负数会引入歧义。人们会认为替换a正确的减号U+2212
会起作用,但这也是一个弱点,大概是因为阿拉伯数字也可能是负数(并且需要以相反的方向呈现......我不确定)。
在任何情况下 - 继续前进,我们可以构造一个这样的函数来强制字符串进入严格的LTR顺序:
function StrictLTR(const s : string) : string;
const
LTR_EMBED = Char($202A);
POP_DIRECTIONAL = Char($202C);
begin
result := LTR_EMBED + s + POP_DIRECTIONAL;
end;
这会在字符串前面放置一个嵌入的从左到右的字符(U+202A
),然后使用Pop-Directional-Formatting(U+202C
)字符。后者删除嵌入式方向格式化提示,并将文本方向返回到前一个上下文中的任何内容。因此,返回的字符串可以安全地用于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;