C# 在.NET字符串中放置货币符号
我正在开发一些代码,将货币符号作为我的应用程序标签的一部分,并且我有一个Unicode十六进制格式的货币符号参考列表。在我的代码中,我对货币的格式设置如下: (货币符号)(十进制字符串)(货币说明) 这种方法适用于大多数符号,但是我注意到一些符号会自动移到十进制值的右侧,即使显式地移到左侧。使用调试器,我甚至可以在字符串本身的最基本级别上看到这种行为,因此这不是表示层中的渲染在更高级别上进行任何操作的情况。以下代码显示了演示该问题的简单案例:C# 在.NET字符串中放置货币符号,c#,.net,internationalization,currency,C#,.net,Internationalization,Currency,我正在开发一些代码,将货币符号作为我的应用程序标签的一部分,并且我有一个Unicode十六进制格式的货币符号参考列表。在我的代码中,我对货币的格式设置如下: (货币符号)(十进制字符串)(货币说明) 这种方法适用于大多数符号,但是我注意到一些符号会自动移到十进制值的右侧,即使显式地移到左侧。使用调试器,我甚至可以在字符串本身的最基本级别上看到这种行为,因此这不是表示层中的渲染在更高级别上进行任何操作的情况。以下代码显示了演示该问题的简单案例: string rialSymbol = "\ufdf
string rialSymbol = "\ufdfc";
string amount = "123.45";
string description = "Rials";
string plainConcat = rialSymbol + " " + amount + " " + description;
Debug.WriteLine(plainConcat);
调试输出(也与应用程序UI中的内容相匹配)如下所示:
123.45(里亚尔符号)里亚尔
(注:根据规定,符号位于小数点右侧,而非左侧)
我尝试了许多方法和各种各样的字符串格式、区域性格式等,但似乎没有解决这个问题。如何在不让框架决定相对于十进制值的符号放置的情况下强制unicode字符的放置?这适用于大多数其他字符,为什么Rial(和其他一些)会导致这种基本字符串行为?是从右向左的Unicode字符。它应该嵌入从右到左的文本中。您正在混合从左到右和从右到左的文本
发件人:
在Unicode编码中,所有非标点符号字符都以书写顺序存储。这意味着字符的书写方向存储在字符中。如果是这种情况,则该字符称为“strong”。但是,标点符号可以出现在LTR和RTL脚本中。它们被称为“弱”字符,因为它们不包含任何方向信息。因此,由软件决定这些“弱”字符的放置方向。有时(在混合方向文本中),这会导致显示错误,这是由贯穿文本的bidi算法引起的,该算法根据算法规则识别LTR和RTL强字符,并为弱字符指定方向
在该算法中,每个串联的强字符序列称为“运行”。位于具有相同方向的两个强字符之间的弱字符将继承其方向。位于两个书写方向不同的强字符之间的弱字符将继承主上下文的书写方向(在LTR文档中,该字符将成为LTR,在RTL文档中,它将成为RTL)。如果一个“弱”字符后跟另一个“弱”字符,则算法将查看第一个相邻的“强”字符有时这会导致意外的显示错误。使用“伪强”字符纠正或防止这些错误。此类Unicode控制字符称为标记。将标记U+200E(从左到右标记)或U+200F(从右到左标记)插入某个位置,以使封闭的弱字符继承其书写方向
例如,要正确显示U+2122™ 商标符号英文名称商标(LTR)在阿拉伯语(RTL)段落中,如果符号后面没有LTR文本,则在商标符号后面插入LRM标记。如果未添加LRM标记,则弱字符™ 将由强LTR字符和强RTL字符相邻。因此,在RTL上下文中,它将被视为RTL,并以错误的顺序显示
因此,解决方案是在从右到左的货币符号后添加一个U+200E从左到右的标记:
string rialSymbol = "\ufdfc\u200e";
string amount = "123.45";
string description = "Rials";
string plainConcat = rialSymbol + " " + amount + " " + description;
Debug.WriteLine(plainConcat);
非常感谢你!正是我所需要的。我在这里找到了BiDi算法的详细信息: