Пользовательский символ валюты и десятичные разряды с использованием decimal.ToString("C") и CultureInfo

У меня проблема с decimal.ToString("C") переопределения. По сути, я хочу сделать следующее:

CultureInfo usCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = usCulture;

NumberFormatInfo LocalFormat = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
LocalFormat.CurrencySymbol = "RM";

Я хочу сделать приведенный выше код функцией (переопределить ToString("C")), когда следующий код выполняется:

decimal paid = Convert.ToDecimal(dr["TotalPaids"]);
lblPaids.Text = paid.ToString("C");

Результаты будут RM4,900.00 вместо $4,900.00

Как мне создать переопределение для decimal.ToString("C") это решило бы мою проблему

Заранее спасибо.

5 ответов

Решение

Чтобы получить такой формат, как RM 11 123 456,00, вам также необходимо установить следующие свойства

CurrentCulture modified = new CultureInfo(Thread.CurrentThread.CurrentCulture.Name);
Thread.CurrentThread.CurrentCulture = modified;
var numberFormat = modified.NumberFormat;
numberFormat.CurrencySymbol = "RM";
numberFormat.CurrencyDecimalDigits = 2;
numberFormat.CurrencyDecimalSeparator = ".";
numberFormat.CurrencyGroupSeparator = ",";

Если вы сделаете это при запуске приложения, это должно сделать формат ms-MY похожим на en-US, но с символом валюты RM каждый раз, когда вы вызываете ToString("C") метод.

Если я правильно понимаю ваш вопрос, вам нужно заменить $ на RM. Если это так, вам нужно передать пользовательский формат...

lblPaids.Text = paid.ToString("C", LocalFormat);

Используйте эту строку формата:

#,##0.00 $;#,##0.00'-  $';0 $
decimal paid = Convert.ToDecimal(dr["TotalPaids"]);
lblPaids.Text = paid.ToString("#,##0.00 $;#,##0.00'-  $';0 $");

Вы можете использовать метод Double.ToString (String, IFormatProvider) https://msdn.microsoft.com/en-us/library/d8ztz0sa(v=vs.110).aspx

double amount = 1234.95;

amount.ToString("C") // whatever the executing computer thinks is the right fomat

amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-ie"))    //  €1,234.95
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("es-es"))    //  1.234,95 € 
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-GB"))    //  £1,234.95 

amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-au"))    //  $1,234.95
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-us"))    //  $1,234.95
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-ca"))    //  $1,234.95
lblPaids.Text = paid.ToString("C",usCulture.Name);

Или же

lblPaids.Text = paid.ToString("C",LocalFormat.Name);

должно работать

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