Неожиданные результаты во время пользовательского форматирования числа и замены строки при использовании определенных символов валюты

У меня есть требование отображать все валюты в следующем формате:

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

Пользователь выберет страну, а я получу код валюты и символ из внешнего сервиса. Затем я использую string.replace, чтобы установить код валюты и символ в строку формата выше.

Таким образом, значение 123,456 (долларов США) будет отформатировано следующим образом:

"USD $123.46"

Этот подход работает для большинства символов валюты, но у меня проблема с символом валюты для Кувейта د.ك. Кажется, я не могу отформатировать какое-либо значение, чтобы символ мог появляться перед цифрами. У меня нет той же проблемы с письмами. Я думаю, что это связано с тем, что арабский язык написан справа налево. Символ даже ведет себя так в браузере. Я не могу выбрать его слева направо, выбор начинается справа. Кроме того, когда я тестировал в linqpad, моя строка отображалась как [Kuwait_Symbol]#,##0,00, однако при вставке в текстовое поле stackru строка получалась د.ك#,##0.00

Обратите внимание, что порядок символов в строке изменился.

Хотя у меня есть чувство, что мне придется рекомендовать использование символов неосуществимо, есть ли способ обойти эту проблему? Кроме того, почему символ не может быть отображен перед цифрами?

1 ответ

Проблема заключается в браузерах и в том, как они обрабатывают символы на языках справа налево, а не в коде, который их генерирует. Если вы попытаетесь

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

вы увидите, что возвращаемое явно имеет символ валюты перед суммой.

Чтобы обойти это, вы можете вызвать рендеринг слева направо в браузере с соответствующим символом Unicode. Например,

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

оказывает правильно в соответствии с вашей спецификацией.

Другие вопросы по тегам