Как отформатировать Культурную валюту с помощью метода ConvertBack в интерфейсе IValueConverter форм Xamarin? - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблема с формами Xamarin, такими как: Я хочу преобразовать число (DataType is Decimal): 12345.2486 для отображения строки в TextBox (раунд 2 десятичных знака после "."):

--->12 345,25 (en-US)

---> 12 345,25 (FR-FR)

---> 12,345,25 (NL-NL)

Я использую кодпосле (метод в IValueConverter интерфейсе):

public class CurrencyDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        try
        {
            var temp = value as string;
            if (string.IsNullOrEmpty(temp))
            {
                return decimal.Zero;
            }

            return value;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return value;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            var stringValue = value as string;

            culture = new CultureInfo(App.DeviceCulture);

            stringValue = ConvertCultureCurrencyToString(stringValue, culture);

            if (string.IsNullOrEmpty(stringValue))
                return "0";

            return stringValue;
        }
        catch 
        {
            return decimal.Zero;
        }
    }
}

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

            stringValue = Convert.ToString(stringValue, ci);
            var currency = decimal.Parse(stringValue, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, ci);

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

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

Я могу ввести в TextBox все значения 12345.2486 (Мое устройство устанавливает язык английский (en-US)).Но когда я ввожу значение 0 с клавиатуры, TextBox отображает значение String.Empty, я не могу ввести значение «0» в TextBox, а когда я вводю очень быстрое значение «0,12», TextBox показывает только «.12».Пожалуйста, помогите мне!Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Я думаю, что у меня есть решение этой проблемы.Причина ошибки, по-видимому, связана со следующим кодом:

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

Формат "#, ###. ##" преобразует строку значения "0,12" в ".12" на языке "en-US "и преобразовать значение строки" 0,12 "в", 12 "на языке" nl-NL ".Поэтому я добавлю этот код после него:

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

И функция "ConvertCultureCurrencyToString" будет переписана следующим образом:

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

        stringValue = Convert.ToString(stringValue, ci);
        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";
    }
}
0 голосов
/ 20 сентября 2018

Вам не нужен конвертер для правильного форматирования строки до 2 десятичных знаков.В вашей привязке для вашей Entry вы можете указать формат строки.Приведенный ниже код должен помочь вам отформатировать:

<Entry Text="{Binding Path=MyDecimal, StringFormat={0:F}}"/>

Вот ссылка на документацию для него от Microsoft: Формат строки

...