delphi - 如何在左侧显示减号(Delphi、TListview)

标签 delphi vcl bidi

我正在尝试在具有属性 BiDiMode = bdRightToLeft 的 TListview 中的项目左侧显示负数的减号。

我在那里尝试了代码:

Thousand Separator in DBGrid

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不要更改我正在显示的字符串或其他内容?

最佳答案

假设您使用的是 unicode 版本的 delphi,您可以提供显式的 RTL 和 LTR 标记来强制语言中性或弱字符的位置(例如破折号 -、感叹号 !等)。

在各种上下文中解析 LTR 和 RTL 文本的规则广泛且复杂。作为引用,您可以找到 bidirectional algorithm specification here 。弱字符的一次传递确实将欧洲数字解析为 LTR(这就是为什么 14.2% 最终朝着正确的方向结束,但使用破折号 - 来表示负号会带来歧义. 人们可能会认为替换适当的减号 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;

关于delphi - 如何在左侧显示减号(Delphi、TListview),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33506701/

相关文章:

xml - 从函数返回 XML 文档

c++ - 如何为动态创建的按钮编写函数 Click()?

android - 如何在 Android Studio 中禁用 RTL 支持(编辑源代码)?

python-3.x - 希伯来语与 tkinter - BiDi

html - 如何用 HTML 编写此 RTL 布局?

windows - 以 SYSTEM 用户身份检测关机

delphi - 如何使用 TDBChart VCL Teechart 组件使用单个数据集制作堆积条形图?

delphi - 使用Indy下载时出现 "302 Found"异常该怎么办?

delphi - 德尔福中的经过/时间间隔?

delphi - 如何将 Delphi XE2 64 位支持添加到简单的 Delphi XE2 32 位 VCL 组件?