Форматировать валюту для разных стран

Я использую Xamarin Forms, и я попытался отформатировать строку (в представлении XAML) для валюты в форме: 1.235.436,00, где запятая , является десятичным разделителем. Сначала я использовал StringFormat{0:C2}, и результат был: $1,235,436.00, который предназначен для США. После я попробовал StringFormat{0:#,0.#0}, результат: 1,235,436.00.

Наконец, я попытался использовать ту же логику, поменяв местами точку и запятую {0:#.0,#0}, и в результате получил: 1235436.000.

Итак, как я могу отформатировать валюту для Франции, Испании, Швеции и т. д. что такое 0.000.000,00 €/kr?

Код XAML:

Label Text = "{Binding value, StringFormat='{0:C2}.'}"

Что в моем случае неверно.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
5 521
4

Ответы 4

Вы не можете сделать это непосредственно в привязке с помощью StringFormat. Вы можете реализовать собственный IValueConverter или создать свойство string, а затем реализовать форматирование в коде:

1235436.ToString("C2", CultureInfo.CreateSpecificCulture("es-ES"));

Это отформатирует число как валюту с определенной настройкой отображения испанской культуры.

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

var culture = CultureInfo.CreateSpecificCulture("en-US");
culture.NumberFormat.CurrencyDecimalSeparator = ",";
culture.NumberFormat.CurrencyGroupSeparator = ".";

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

Добавление настраиваемого свойства не работает при генерации apk с привязкой. Я озадачен

Daniel Dolz 21.03.2019 14:38

Вы использовали правильный формат {0:C2}. Чтобы изменить формат в зависимости от региона, вам необходимо изменить культуру в потоке. Похоже, у вас установлен en-US по умолчанию, как вы и сказали. Проверить это можно так:

  CultureInfo current = CultureInfo.CurrentCulture;
  Console.WriteLine("The current culture is {0}", current.Name);

Чтобы изменить его на Францию:

  CultureInfo.CurrentCulture = new CultureInfo("fr-FR");

И теперь ваше значение будет автоматически отформатировано как 1.235.436,00.

Спасибо за совет, но в Xamarin Forms я не могу использовать выражение: CultureInfo.CurrentCulture = new CultureInfo("fr-FR");

Newie 12.03.2018 21:20

Это не выражение, вам нужно добавить его в свой код C#. Когда вы запускаете приложение, вам необходимо определить язык и регион телефона пользователя, а затем использовать строку из моего ответа, чтобы соответствующим образом установить культуру потока.

Racil Hilan 12.03.2018 21:30

Спасибо Расил Хилан и Мартин Зикмунд за предложения :) Вот ответ в Xamarin Forms: CultureInfo myCurrency = new CultureInfo("fr-FR"); CultureInfo.DefaultThreadCurrentCulture = myCurrency;

Newie 13.03.2018 15:53

Да, это похоже на мое предложение, только использует DefaultThreadCurrentCulture вместо CurrentCulture. После того, как вы запустите эту строку кода, все форматы (например, валюта, даты и т. д.) Будут выполнены с использованием указанной культуры.

Racil Hilan 13.03.2018 17:02

вы пытаетесь пройти:

// Get Present Culture in app.

var ci = new CultureInfo(App.DeviceCulture);

// Преобразовать в формат String.

stringValue = ConvertCultureCurrencyToString(stringValue, ci);

// Создаем метод преобразования в формат

public static string ConvertCultureCurrencyToString(string stringValue, CultureInfo ci)
    {
        try
        {
            if (string.IsNullOrEmpty(stringValue))
                return "0";

            stringValue = System.Convert.ToString(stringValue, ci);
            // currency -> double (format to double)
            var currency = decimal.Parse(stringValue, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, ci);

            stringValue = currency.ToString("#,###.###", ci);

            if (stringValue.FirstOrDefault() == '.' || stringValue.FirstOrDefault() == ',')   
                stringValue = $"0{stringValue}";

            return stringValue;
        }
        catch
        {
            return "0";
        }

    }

Добавьте строку кода в xaml.cs Это преобразует культуру

CultureInfo myCurrency = new CultureInfo("en-US");
CultureInfo.DefaultThreadCurrentCulture = myCurrency;

В xaml

<Label Text = "{Binding value, StringFormat='{0:#,0.#0}'}"

Результат: 5,245.00

Я получаю эту информацию через список

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