将非英文文本向左对齐

问题描述 投票:0回答:1

我正在以类似格式的收据形式打印订单到RichtextBox,当我的商品名称为英文时,一切正常,当我的商品名称为非英语(如希伯来语或阿拉伯语)时,这两种语言都是从右到右写的左,整体格式变得混乱

所有文字均为英文时的示例

1...5...10...15...20...25...30...35...40...45.48
ITM                          Price   QTY   Value
------------------------------------------------
Test                         6,000   x1    6,000
test02                       0       x1        0
test03                       0       x1        0

您可以看到,所有内容都很整齐且格式正确,但是当我有一个名称是希伯来语或阿拉伯语的项目时,会发生这种情况

1...5...10...15...20...25...30...35...40...45.48
ITM                          Price   QTY   Value
------------------------------------------------
Test                         6,000   x1    6,000
1,500                        تيست    x1    1,500

如您所见,非英语文本在价格列下移动。正如我所提到的,这仅发生在从右至左编写的语言中。

我进行格式化的代码

int Item_Length = -29;
        int Price_Length = -8;
        int Qty_Length = -3;
        int Value_Length = 8;

        string Seperator = "------------------------------------------------"+"\n";

        string ruler = "1...5...10...15...20...25...30...35...40...45.48"+"\n";
        rTxtReceipt.Text = ruler;

        string Headers = string.Format("{0,"+Item_Length+"}{1,"+Price_Length+"}{2,"+Qty_Length+"}{3,"+Value_Length+"}", "ITM", "Price", "QTY", "Value")+"\n";
        rTxtReceipt.AppendText(Headers);
        rTxtReceipt.AppendText(Seperator);


        string Rows = null;
        foreach (var item in Items_List)
        {
          Rows += string.Format("{0,"+Item_Length+"}{1," + Price_Length + ":N0}{2," + Qty_Length + "}{3," + Value_Length + ":N0}", item.ItemName, item.ItemSellPrice, ("x" + item.SellsQty), item.SellsValue) + "\n";
        }


        rTxtReceipt.AppendText(Rows);

其中rTxtReceipt是RichTextBox控件。任何人都可以建议如何制作所有文本,而不考虑从左到右对齐的语言?

我确实具有可以检测文本是否为英文的功能,但是如果文本不是英语,我不知道在哪里更改

public bool IsEnglish(string inputstring)
{
Regex regex = new Regex(@"[A-Za-z0-9 .,-=+(){}\[\]\\]");
MatchCollection matches = regex.Matches(inputstring);

if (matches.Count.Equals(inputstring.Length))
    return true;
else
    return false;
}
c# richtextbox right-to-left text-formatting
1个回答
0
投票
问题与双向文本中被数字包围的RTL字符的行为有关。有关更多信息,您可以阅读本文:Right-to-left language support and bidirectional text

[例如,如果您拥有一个拉丁字母:تيست x1,500,而不是紧跟商品名称后的价格,您就不会遇到这个问题。

显然,这不是您想要的。因此,要强制文本方向保持LTR并防止数字混乱,您只需在项目名称后立即添加“隐藏字符”即可。幸运的是,有一个特定的字符用于此目的。它称为Left-to-Right Mark

在适当的位置添加以下常量:

const string LtrMark = "\u200E";

然后您可以简单地执行以下操作:

Rows += string.Format(format, item.ItemName + LtrMark, item.ItemSellPrice, ... // ^^^^^^^

© www.soinside.com 2019 - 2024. All rights reserved.