我正在以类似格式的收据形式打印订单到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;
}
[例如,如果您拥有一个拉丁字母:تيست x1,500
,而不是紧跟商品名称后的价格,您就不会遇到这个问题。
显然,这不是您想要的。因此,要强制文本方向保持LTR并防止数字混乱,您只需在项目名称后立即添加“隐藏字符”即可。幸运的是,有一个特定的字符用于此目的。它称为Left-to-Right Mark。
在适当的位置添加以下常量:
const string LtrMark = "\u200E";
然后您可以简单地执行以下操作:
Rows += string.Format(format, item.ItemName + LtrMark, item.ItemSellPrice, ... // ^^^^^^^