Форматирование валюты - Windows Store Apps

В предыдущей.Net жизни способ, которым я отформатировал бы валюту (любая валюта) для текущего языка, будет состоять в том, чтобы сделать что-то вроде этого:

public string FormatCurrencyValue(string symbol, decimal val) 
{
  var format = (NumberFormatInfo)CultureInfo.CurrentUICulture.NumberFormat.Clone();
  //overwrite the currency symbol with the one I want to display
  format.CurrencySymbol = symbol;
  //pass the format to ToString();
  return val.ToString("{0:C2}", format);
}

Это возвращает покупательную силу валюты, без любых десятичных частей, отформатированных для данного обозначения денежной единицы, приспособленного для текущей культуры - например, 50.00£ для en-Великобритания , но 50,00£ для FR франка .

Тот же самый код, бегущий под Windows Store, предоставляет {50:C} .

Смотря на (довольно ужасную) документацию WinRT, мы действительно имеем CurrencyFormatter класс - но это только после пыталось уволить конструктора с " £ " как параметр и получало ArgumentException (документация WinRT настолько особенная - у этого нет практически информации об исключениях), что я понял, что это хотело обозначение денежной единицы ISO (честно, название параметра currencyCode , но несмотря на это).

Теперь - я могу получить одного из тех также, но у CurrencyFormatter есть другая проблема, которая делает его неподходящим для форматирования валюты - можно только отформатировать дважды , долго и ulong типы - нет никакого десятичное число перегрузка - который может сделать для некоторых интересных ошибок стоимости в некоторых ситуациях.

Таким образом, как отформатировать валюты динамично в WinRT.net?

3
nl ja de
Так I' m не единственный, кто думает что-то названное CurrencyFormatter, должен принять десятичное число в качестве параметра.
добавлено автор James McLachlan, источник

1 ответы

Я нашел, что можно все еще использовать строки формата в старинном стиле с NumberFormatInfo класс - это просто, что, необъяснимо, это не работает, когда вы используете ToString . При использовании Последовательность. Формат вместо этого, тогда это работает.

Таким образом, мы можем переписать код в моем вопросе:

public string FormatCurrencyValue(string symbol, decimal val) 
{
  var format = (NumberFormatInfo)CultureInfo.CurrentUICulture.NumberFormat.Clone();
  //overwrite the currency symbol with the one I want to display
  format.CurrencySymbol = symbol;
  //pass the format to String.Format
  return string.Format(format, "{0:C2}", val);
}

Который дает желаемый результат.

1
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Про Windows
Про Windows
941 участник(ов)

Microsoft Windows и всё, что с этим связано. Список интересных групп и каналов: https://github.com/goq/telegram-list

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot