【问题标题】:Xamarin Currency Converter Allow NegativeXamarin 货币转换器允许负数
【发布时间】:2022-01-26 18:33:47
【问题描述】:

我有一个货币转换器类将输入输入转换为货币。但是,我也想允许负值。

<Entry Text="{Binding Price, Converter={StaticResource currencyConverter}}" Keyboard="Numeric" Placeholder="$0.00""/>
public class CurrencyConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Decimal.Parse(value.ToString()).ToString("C");
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string valueFromString = Regex.Replace(value.ToString(), @"\D", "");

            if (valueFromString.Length <= 0)
                return 0m;

            long valueLong;
            if (!long.TryParse(valueFromString, out valueLong))
                return 0m;

            if (valueLong <= 0)
                return 0m;

            return valueLong / 100m;
        }
    }

【问题讨论】:

    标签: c# xamarin converters


    【解决方案1】:

    你应该用你的正则表达式改变方法。

    不要替换所有非数字字符,而是尝试使用可能的前导破折号捕获数字。

    这个正则表达式是:^-?\d+$

    你可以看看这个正则表达式是如何工作的here

    而且它的使用方式有点不同。

    string valueFromString = Regex.Match("", @"^-?\d+$").Value;
    

    最后一个认为:你应该删除最后一个条件,因为如果输入值小于零,则返回零。

    if (valueLong <= 0)
        return 0m;
    

    我不知道应用程序的其余逻辑,但这些只是第一步。

    【讨论】:

    • 我尝试使用那个正则表达式,但是当我输入一个数字时它只是给了我“”,例如,“$00.02”
    • 是否有一个正则表达式可以用来只接受数字或括号?
    【解决方案2】:

    根据您描述的要求,您只需要将输入的数字转换为Decimal类型。

    1. 只需要在方法中判断输入的数字是否为负数,如果为负数,只需替换字符串即可。

    2. 为了让代码更简单,可以使用Entry的Completed方法,内部判断。

    我写了一个小例子供大家参考:

    这是后台代码(查看注释添加的位置):

     private void Entry_Completed(object sender, EventArgs e)
        {
            int myenry =  int.Parse((sender as Entry).Text.ToString());
            string returnEntry = Decimal.Parse(mytest.Text.ToString()).ToString("C");
            if (myenry < 0) //Judge here and perform string replacement
            {
                returnEntry = returnEntry.Insert(2,"-");
            }
            mytest1.Text = returnEntry;
        }
    

    【讨论】:

    • 所以问题是我希望输入被屏蔽为货币,这就是转换器类正在做的事情。
    • 我不太明白你的意思。你的意思是每次输入都要修改吗?
    • 而你想把值改成复数,我提供的代码中的注释可以结束这个问题。
    • 我发布的转换器类屏蔽了用户输入,因此它始终采用 $##.## 格式,但我不知道如何让它显示负数
    • 你只需要使用我提供的if方法中的代码即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多