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

时间:2010-11-24 22:35:42

标签: c# .net internationalization currency

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

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

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

string rialSymbol = "\ufdfc";
string amount = "123.45";
string description = "Rials";
string plainConcat = rialSymbol + " " + amount + " " + description;
Debug.WriteLine(plainConcat);

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

123.45(里亚尔符号)里亚尔

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

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

1 个答案:

答案 0 :(得分:9)

U+FDFC是一个从右到左的Unicode字符。它意味着嵌入从右到左的文本。您正在混合从左到右和从右到左的文本。

来自Wikipedia

  

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

     

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

     

例如,要在阿拉伯语(RTL)段落中正确显示英文名称品牌(LTR)的U + 2122™商标符号,如果符号后面没有符号,则在商标符号后面插入LRM标记LTR文本。如果未添加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);