Xamarin Forms 如何将逗号添加到将使用数据(整数)不断更新的输入字段

Posted

技术标签:

【中文标题】Xamarin Forms 如何将逗号添加到将使用数据(整数)不断更新的输入字段【英文标题】:Xamarin Forms How to add commas to an entry field that will continually be updated with data (integers) 【发布时间】:2019-12-22 03:45:54 【问题描述】:

我正在使用适用于(iosandroid)的 Xamarin Forms 构建移动应用程序我创建了一个绑定到数据源以检索数量的输入字段。我需要在视图中格式化该数据并允许它是可编辑的,并且如果存在数字并且需要逗号,则始终显示逗号,例如(9,000 对 9,000,000 等)。目前,该行为允许逗号仅在启动应用程序时最初检索(调用)数据时显示,使用 ("Binding example.Mydata, StringFormat='0:n0'")。我尝试了很多变体 0:n 、 F:0 、 0:n0 等。

我尝试了许多变体 0:n 、 F:0 、 0:n0 等。行为仍然相同。初始返回将显示带有逗号的值,但一旦编辑,逗号将不会重新出现。

我也尝试过创建一个行为类


    public class FieldFormatValidator : Behavior<Entry>

    protected override void OnAttachedTo(Entry bindable)
    
        bindable.PropertyChanged += Bindable_PropertyChanged;
    

    protected override void OnDetachingFrom(Entry bindable)
    
        bindable.PropertyChanged += Bindable_PropertyChanged;
    
    void Bindable_PropertyChanged(object sender, PropertyChangedEventArgs 
      e)
    
        var entry = sender as Entry;
        double doubleValue = 0;
        if (entry != null)
        
            try
            
            //object s = null;
            doubleValue = 
        Double.ParseDouble(entry.ToString().Replace(',', '.'));
        
        catch (NumberFormatException)
        
            //Error
            
        
    

Xaml:

 <Entry Grid.Row="5" Grid.Column="1" HorizontalOptions="EndAndExpand" 
     WidthRequest="150" Keyboard="Numeric" ReturnType="Done" Text=" 
     Binding 
     Opportunity.MyExample"                              
     AutomationId="OppAnnualQtyValueEntry">
         <Entry.Behaviors>
             <local:FieldFormatValidator/>
             </Entry.Behaviors>
         </Entry>
  </Grid>

请提供内联 Xaml 代码以允许输入字段可编辑并保持逗号格式,或帮助创建一个也可以将逗号放入输入字段的行为类。谢谢

【问题讨论】:

xamarinhelp.com/masked-entry-in-xamarin-forms 【参考方案1】:

是的,您可以使用Behavior。并且我创建了一个简单的demo来实现这个功能,主要代码如下:

NumberMaskBehavior

   public class NumberMaskBehavior : Behavior<Entry>
    
        ///
        /// Attaches when the page is first created.
        /// 

        protected override void OnAttachedTo(Entry entry)
        
            entry.TextChanged += OnEntryTextChanged;
            base.OnAttachedTo(entry);
        

        ///
        /// Detaches when the page is destroyed.
        /// 

        protected override void OnDetachingFrom(Entry entry)
        
            entry.TextChanged -= OnEntryTextChanged;
            base.OnDetachingFrom(entry);
        

        private void OnEntryTextChanged(object sender, TextChangedEventArgs args)
        
            System.Diagnostics.Debug.WriteLine("*** args.NewTextValue *** " + args.NewTextValue + "  -----  args.OldTextValue =  " + args.OldTextValue);
            if (!string.IsNullOrWhiteSpace(args.NewTextValue))
            
                // If the new value is longer than the old value, the user is
                //if (args.OldTextValue != null && args.NewTextValue.Length < args.OldTextValue.Length)
                //    return;

                var value = args.NewTextValue;

                string actual_number = "";
                actual_number = value;
                actual_number = actual_number.Replace(",", "");

                string result_last = dataFormat(actual_number);
                System.Diagnostics.Debug.WriteLine("****   result = " + result_last);


               int actual_length = actual_number.Length;

                ((Entry)sender).Text = result_last;
            
        

        public static String dataFormat(String text)
        
            DecimalFormat df = null;
            if (text.IndexOf(".") > 0)
            //include decimal
                if (text.Length - text.IndexOf(".") - 1 == 0)
                //include a decimal
                    df = new DecimalFormat("###,##0.");
                
                else if (text.Length - text.IndexOf(".") - 1 == 1)
                //include two decimals
                    df = new DecimalFormat("###,##0.0");
                
                else
                //include more than two decimal
                    df = new DecimalFormat("###,##0.00");
                
            
            else
            //only integer
                df = new DecimalFormat("###,##0");
            
            double number = 0.0;
            try
            
                number = Double.Parse(text);
            
            catch (Exception e)
            
                number = 0.0;
            
            return df.Format(number);

        
    

并像这样使用:

  <StackLayout HorizontalOptions="Fill"
             VerticalOptions="Fill"
             Padding="5,20,5,5">
    <Label Text=" Number Formatting"
           FontAttributes="Bold"
           FontSize="Medium"></Label>
    <Entry  Keyboard="Numeric" >
        <Entry.Behaviors>
            <behavior:NumberMaskBehavior  />              
        </Entry.Behaviors>
    </Entry>
</StackLayout>

效果是:

【讨论】:

谢谢您,我会尝试执行您的建议 以上代码仅适用于 Android。需要添加Mono.Android.dll,导致部署到IOS模拟器失败?请帮忙。谢谢【参考方案2】:

刚刚修改了 dataFormat 函数,使其适用于 ios 和 android

 public static String dataFormat(String text)
        
            string format = null;
            if (text.IndexOf(".") > 0)
            //include decimal
                if (text.Length - text.IndexOf(".") - 1 == 0)
                //include a decimal
                    format = "###,##0.";
                
                else if (text.Length - text.IndexOf(".") - 1 == 1)
                //include two decimals
                    format = "###,##0.0";
                
                else
                //include more than two decimal
                    format = "###,##0.00";
                
            
            else
            //only integer
                format = "###,##0";
            
            double number = 0.0;
            try
            
                number = Double.Parse(text);
            
            catch (Exception e)
            
                number = 0.0;
            


            return number.ToString(format);

        

【讨论】:

以上是关于Xamarin Forms 如何将逗号添加到将使用数据(整数)不断更新的输入字段的主要内容,如果未能解决你的问题,请参考以下文章

如何将json.net添加到Xamarin Forms,本地项目或PCL上?

如何在 xamarin.forms 中添加视频播放器

Xamarin.Forms 如何将数据从 CollectionView 传输到不同的视图?

如何将 Forms.Image 中的最终照片保存到 xamarin 表单中的本地

如何创建一个自定义控件,用户可以在 Xamarin.Forms 中添加任何类型的视图?

如何将 Xamarin Forms Shell 集成到 MvvmCross 设置中