【问题标题】:How to format Culture Currency use method ConvertBack in IValueConverter interface of Xamarin Forms?如何在 Xamarin Forms 的 IValueConverter 接口中格式化文化货币使用方法 ConvertBack?
【发布时间】:2018-09-20 16:18:06
【问题描述】:

我在 Xamarin 表单中遇到问题,例如: 我想转换数字(DataType 为十进制):12345.2486 以在 TextBox 上显示字符串(“。”之后的小数点后 2 位):

---> 12,345.25(美国)

---> 12 345.25(法国-法国)

---> 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,我无法在 TextBox 上输入值“0”,当我输入非常快的值“0.12”时,TextBox 只显示“.12”。 请帮我!谢谢!

【问题讨论】:

    标签: c# xamarin mvvm xamarin.forms prism


    【解决方案1】:

    您不需要转换器即可将字符串正确格式化为小数点后 2 位。在Entry绑定 中,您可以指定字符串格式。下面的代码应该可以帮助您格式化:

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

    这是来自Microsoft 的文档链接: Format String

    【讨论】:

    • 我认为 StringFormat={0:F} 只使用标签,我从未尝试将它用于条目。感谢您的帮助!
    • StringFormat 在提供 Binding 时适用于任何控件。只有在使用条目和标签都具有的字符串属性(例如Text)时才有意义。如果需要,按钮也可以使用 StringFormat
    【解决方案2】:

    我认为我有办法解决这个问题。 错误的原因似乎是由于以下代码:

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

    格式“#,###.##”将值字符串“0.12”转换为“en-US”语言中的“.12” 并将值字符串“0,12”转换为“nl-NL”语言的“,12”。 所以我会在后面加上这段代码:

    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";
        }
    }
    

    【讨论】:

    • 它的工作。但是像 iphone5 或三星 Galaxy S7 等小设备,它的键盘无法将语言键盘更改为语言设备。所以,大小写输入字符“.”或“,”将不起作用。
    • @BillNguyen,我会注意这个案例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2011-09-16
    • 1970-01-01
    • 2019-10-19
    • 2016-04-22
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多