Я новичок в создании веб-приложений в ASP.NET и пытаюсь отобразить валюту в кенийских шиллингах. Символ шиллинга - KES.

У меня есть это:

<span>
    <b>Price: </b><%#:String.Format(new System.Globalization.CultureInfo("sw-KE"), "{0:c}", Item.BeatPrice)%> 
</span>

Название культуры получено из http: / /msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.80%29.aspx.

Однако цена отображается как S3,000 вместо KES 3,000.

Что мне нужно сделать, чтобы правильно отформатировать цену?

5
Kinyanjui Kamau 3 Апр 2014 в 15:55
Если вы посмотрите на символ валюты для выбранной локали, он указан как «S», поэтому, если не большая ошибка, это правильный формат.
 – 
Steve
3 Апр 2014 в 16:04
1
Существует разница между символом валюты и кодом валюты. Таким же образом вы можете спросить, почему вы можете написать 12 долларов США и 12 долларов США или 12 фунтов стерлингов и 12 фунтов стерлингов.
 – 
Ondrej Svejdar
3 Апр 2014 в 16:05
@ Стив, символ валюты «S» неверен. Я живу здесь, в Кении, и валюта пишется либо как «KES», либо как «Ksh» (см. комментарий Ондрея Свейдара), а не как «S».
 – 
Kinyanjui Kamau
3 Апр 2014 в 16:43

6 ответов

Лучший ответ

CurrencySymbol лучше не кодировать жестко, поэтому следует использовать

var regionInfo = new RegionInfo("sw-KE");
var currencySymbol = regionInfo.ISOCurrencySymbol;

Чтобы получить правильный CurrencySymbol для вашей культуры.

// редактировать: Или вы можете попробовать эту функцию:

public static string FormatCurrency(decimal value)
{
    CultureInfo cultureInfo = Thread.CurrentThread.CurrentUICulture;
    RegionInfo regionInfo = new RegionInfo(cultureInfo.LCID);
    string formattedCurrency = String.Format("{0} {1:C}", regionInfo.ISOCurrencySymbol, value);
    return formattedCurrency.Replace(cultureInfo.NumberFormat.CurrencySymbol, String.Empty).Trim();

}

Это дает вам отформатированную строку валюты на основе текущей UICulture.

3
TheCutter 3 Апр 2014 в 16:31

Если региональные настройки вашего устройства настроены правильно, вы можете использовать:

Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "{0:c}", Item.BeatPrice));

Он автоматически принимает культуру в зависимости от региональных настроек вашего компьютера.

1
Palak.Maheria 3 Апр 2014 в 16:09

Если формат отличается от ожидаемого, вы можете добавить настраиваемое форматирование строки:

String.Format("KES {0:N3}", Item.BeatPrice)

Надеюсь, это сработает.

4
Palak.Maheria 3 Апр 2014 в 16:04
Оцените быстрый ответ. Почему формат не такой, как ожидалось? Я пробовал с валютами многих других стран и не видел проблем.
 – 
Kinyanjui Kamau
3 Апр 2014 в 16:01
Очень странно: я использую .NET 4.5.1 после тестирования, это дает мне KSh
 – 
Michael Mairegger
3 Апр 2014 в 16:08
Потому что по какой-то причине Windows определяет System.Globalization.CultureInfo.GetCultureInfo("sw-KE").NumberFormat.CurrencySymbol как S
 – 
hometoast
3 Апр 2014 в 16:10
@xxMUROxx. Я также использую .NET 4.5.1 с VS 2013, но получаю версию S.
 – 
Kinyanjui Kamau
3 Апр 2014 в 16:20
Это очень странно.
 – 
Michael Mairegger
3 Апр 2014 в 16:21

Как сказал Ондрей Свейдар , есть два символа, например, доллар против доллара:

var region = new System.Globalization.RegionInfo("sw-KE");

Console.WriteLine(region.CurrencySymbol);  // "S"
Console.WriteLine(region.ISOCurrencySymbol);  // "KES"

Примечание. Когда я запустил это в IDEone (которая компилируется с Mono), результаты были неожиданными ("KES" и " Кенийский шиллинг »).

1
nmclean 3 Апр 2014 в 16:25

При использовании String.Format «c» или «C» дает вам символ валюты для указанного языка и региональных параметров. Вы пытаетесь отобразить ISO-код валюты для Кенийских шиллингов. Код ниже отобразит именно то, что вы хотели.

String.Format("{0} {1}", (new RegionInfo("sw-KE")).ISOCurrencySymbol, Item.BeatPrice)

Если вы не меняете культуру в своем приложении, это легко сделать.

String.Format("{0} {1}", "KES", Item.BeatPrice)
1
likeitlikeit 3 Апр 2014 в 16:55

Лучше всего отформатировать строку в формате валюты {0:C} и изменить UICulture или культуру текущего потока на KES, а ASP.NET достаточно умен, чтобы отображать страницу в соответствии с вашей текущей культурой.

Примечание: вы можете изменить культуру, изменив культуру браузера (вы можете сделать это в целях разработки), но передовая практика меняет культуру программно, например, здесь я меняю базу культуры для пользовательского Cookie, а культура mu по умолчанию - en - нам это нравится.

protected override void InitializeCulture()
{
    HttpCookie cultureCookie = Request.Cookies["culture"];

    if (cultureCookie == null)
    {
        cultureCookie = new HttpCookie("culture", "en-US");
        Response.Cookies.Add(cultureCookie);
    }

    Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureCookie.Value);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureCookie.Value);

    base.InitializeCulture();
}
0
Emad Mokhtar 3 Апр 2014 в 16:19