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

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

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

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

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

"USD $123.46"

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

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

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

1 Ответ

0 голосов
/ 26 июня 2011

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

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);

отображается правильно согласно вашей спецификации.

...