Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将非英语文本向左对齐_C#_Richtextbox_Right To Left_Text Formatting - Fatal编程技术网

C# 将非英语文本向左对齐

C# 将非英语文本向左对齐,c#,richtextbox,right-to-left,text-formatting,C#,Richtextbox,Right To Left,Text Formatting,我正在将订单以类似收据的格式打印到RichtextBox上,当我的商品名称是英语时,一切都正常。一旦我的商品名称是非英语语言,如希伯来语或阿拉伯语,这两种语言从右到左书写,整个格式就会变得混乱 所有文本均为英文时的示例 1…5…10…15…20…25…30…35…40…45.48 ITM价格数量值 ------------------------------------------------ 测试6000 x1 6000 测试02 0 x1 0 测试03 0 x1 0 正如你所看到的,一切都

我正在将订单以类似收据的格式打印到RichtextBox上,当我的商品名称是英语时,一切都正常。一旦我的商品名称是非英语语言,如希伯来语或阿拉伯语,这两种语言从右到左书写,整个格式就会变得混乱

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

1…5…10…15…20…25…30…35…40…45.48
ITM价格数量值
------------------------------------------------
测试6000 x1 6000
测试02 0 x1 0
测试03 0 x1 0
正如你所看到的,一切都很整洁,格式也很好,但当我有一个项目,它的名字是希伯来语或阿拉伯语,这就是发生的事情

1…5…10…15…20…25…30…35…40…45.48
ITM价格数量值
------------------------------------------------
测试6000 x1 6000
1500تيستx1 1500
如您所见,非英语文本在Price列下移动。正如我提到的,这种情况只发生在从右到左书写的语言中

我的代码,它进行格式化

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);
其中
rtxtreceive
是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;
    }
}

这个问题与RTL字符在双向文本中被数字包围时的行为有关。有关更多信息,请阅读本文:

比如说,如果商品名称后面不是价格,而是一个拉丁字母:
x1500
,你就不会遇到这个问题

很明显,那不是你想要的。因此,为了强制文本的方向保持LTR并防止数字弄乱它,只需在项目名称后立即添加一个“隐藏字符”。幸运的是,有一个特定的字符用于此目的。这叫一个

  • 首先,在适当的位置添加以下常量:

    const string LtrMark = "\u200E";
    
  • 然后你可以简单地做这样的事情:*

现在,您不必担心检查项目名称是否为英语。只需插入该字符即可用于LTR和RTL语言。但是请注意,您需要使用一种既适用于英语又适用于阿拉伯语的固定宽度字体(例如Courier New)。这就是最终结果的样子:



*因为LTR标记是零宽度字符,它将使以下值显示在后面一个字符。为了避免这种情况,您可以对项目使用
Item\u Length-1
,或对标题使用
Item\u Length+1
,以确保它们对齐。

问题与RTL字符在双向文本中被数字包围时的行为有关。有关更多信息,请阅读本文:

比如说,如果商品名称后面不是价格,而是一个拉丁字母:
x1500
,你就不会遇到这个问题

很明显,那不是你想要的。因此,为了强制文本的方向保持LTR并防止数字弄乱它,只需在项目名称后立即添加一个“隐藏字符”。幸运的是,有一个特定的字符用于此目的。这叫一个

  • 首先,在适当的位置添加以下常量:

    const string LtrMark = "\u200E";
    
  • 然后你可以简单地做这样的事情:*

现在,您不必担心检查项目名称是否为英语。只需插入该字符即可用于LTR和RTL语言。但是请注意,您需要使用一种既适用于英语又适用于阿拉伯语的固定宽度字体(例如Courier New)。这就是最终结果的样子:



*因为LTR标记是零宽度字符,它将使以下值显示在后面一个字符。为了避免这种情况,您可以对项目使用
Item_Length-1
,或对标题使用
Item_Length+1
,以确保它们对齐。

只有当控件具有固定间距字体时,这样的格式才能正确工作。对于一个能显示阿拉伯符号的人来说,这是一个艰难的选择。只是不要使用空格,。这样的格式只有在控件具有固定间距字体时才能正常工作。对于一个能显示阿拉伯符号的人来说,这是一个艰难的选择。只是不要使用空格。这绝对解决了我的问题,现在不管使用哪种语言,所有内容都是格式的,非常感谢!这绝对解决了我的问题,现在不管用什么语言,一切都是格式的,非常感谢!