使用某些货币符号时,自定义数字格式和字符串替换期间出现意外结果

本文关键字:替换 字符串 结果 意外 格式 数字 货币 符号 自定义 | 更新日期: 2023-09-27 17:55:04

我需要以以下格式显示所有货币:

"[Code] [Symbol]#,##0.00;[Code] [Symbol](#,##0.00)"

用户将选择一个国家,我将从外部服务获得货币代码和符号。然后我使用字符串。替换将货币代码和符号设置为上面的格式字符串。

所以值123.456(美元)将被格式化如下:

"USD $123.46"

这种方法适用于大多数货币符号,但我对科威特د.ك的货币符号有问题。我似乎无法格式化任何值,以允许符号出现在数字之前。我对字母没有同样的问题。我认为这与阿拉伯语是从右向左书写的事实有关。该符号在浏览器中也是如此。我不能从左向右选择,选择是从右开始的。另外,当我在linqpad中测试时,我的字符串显示为[Kuwait_Symbol]#,##0.00,然而粘贴在stackoverflow文本框中导致字符串为د.ك#,##0.00

请注意,字符串中字符的顺序已经改变。

虽然,我有一种感觉,我将不得不建议使用符号是不可行的,有什么方法来解决这个问题吗?还有,为什么符号不能显示在数字之前?

使用某些货币符号时,自定义数字格式和字符串替换期间出现意外结果

问题源于浏览器以及它们处理从右向左语言字符的方式,而不是生成这些字符的代码。如果你尝试

var kuwaitCulture = new System.Globalization.CultureInfo("ar-KW");
Response.Write(Server.UrlEncode(amount.ToString("c", kuwaitCulture)));

你会看到返回的内容在金额之前有一个CurrencySymbol。

要解决这个问题,可以在浏览器中使用相应的Unicode字符强制从左到右呈现。例如,

Response.Write(''u202A' + kuwaitCulture.NumberFormat.CurrencySymbol + ''u202C' + amount);