.NET字符串中的货币符号放置

DMG*_*DMG 5 .net c# currency internationalization

我正在开发一些代码来在我的应用程序中将货币符号作为标签的一部分呈现,我有一个Unicode十六进制格式的货币符号参考列表.在我的代码中,我按如下方式格式化货币:

(货币符号)(十进制字符串)(货币说明)

这种方法适用于大多数符号,但是我注意到,即使明确放置在左侧,某些符号也会自动移动到十进制值的右侧.使用调试器,即使在字符串本身的最基本级别,我也会看到这种行为,因此这不是表示层中渲染在更高级别进行任何操作的情况.以下代码展示了演示问题的简单案例:

string rialSymbol = "\ufdfc";
string amount = "123.45";
string description = "Rials";
string plainConcat = rialSymbol + " " + amount + " " + description;
Debug.WriteLine(plainConcat);
Run Code Online (Sandbox Code Playgroud)

调试输出(也与应用程序UI中的内容相匹配)如下:

123.45(里亚尔符号)里亚尔

(注意:符号位于小数点右侧而不是左侧,如指定的那样)

我已经尝试了很多方法和各种字符串格式,文化格式等,但似乎没有解决这个问题.如何在不让框架决定相对于小数值的符号位置的情况下强制执行unicode字符的放置?这适用于大多数其他角色,为什么Rial(和其他一些)导致这种类型的基本字符串行为?

dtb*_*dtb 9

U + FDF​​C是一种从右到左的Unicode字符.它意味着嵌入从右到左的文本.您正在混合从左到右和从右到左的文本.

来自维基百科:

在Unicode编码中,所有非标点符号都按写入顺序存储.这意味着字符的书写方向存储在字符中.如果是这种情况,则该角色称为"强".但是,标点字符可以出现在LTR和RTL脚本中.它们被称为"弱"字符,因为它们不包含任何方向信息.因此,软件决定将这些"弱"字符放在哪个方向.有时(在混合方向文本中)这会导致显示错误,这是由贯穿文本的双向算法引起的,并根据算法的规则识别LTR和RTL强字符并为弱字符指定方向.

在算法中,每个连接的强字符序列称为"运行".位于具有相同方向的两个强字符之间的弱字符将继承其方向.位于具有不同书写方向的两个强字符之间的弱字符将继承主要上下文的书写方向(在LTR文档中,字符将变为LTR,在RTL文档中,它将变为RTL).如果"弱"字符后面跟着另一个"弱"字符,算法将查看第一个相邻的"强"字符.有时这会导致无意的显示错误.使用"伪强"字符可以纠正或阻止这些错误.这种Unicode控制字符称为标记.标记U + 200E(从左到右标记)或U + 200F(从右到左标记)将被插入到一个位置,以使封闭的弱字符继承其书写方向.

例如,要在阿拉伯语(RTL)段落中正确显示英文名称品牌(LTR)的U + 2122™商标符号,如果符号后面没有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);
Run Code Online (Sandbox Code Playgroud)