You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xamarin Forms中实现PayPal式的小数优先输入?

在Xamarin Forms中实现「小数优先」输入功能的方案

核心思路

将用户输入的每一位数字视为金额的分位,实时转换为以「元」为单位的数值(即除以100),并格式化显示为带两位小数的字符串(用逗号作为小数分隔符)。例如输入3→0,03,输入38→0,38,输入385→3,85。

实现方案:使用Behavior(推荐)

通过自定义Behavior<Entry>处理输入逻辑,无需自定义Entry控件,可复用在任何标准Entry上。

1. 创建DecimalFirstEntryBehavior类

using System;
using System.Globalization;
using System.Linq;
using Xamarin.Forms;

public class DecimalFirstEntryBehavior : Behavior<Entry>
{
    private string _rawDigits = string.Empty;
    // 指定使用逗号作为小数分隔符的文化(如西班牙、德国等区域)
    private readonly CultureInfo _commaDecimalCulture = new CultureInfo("es-ES");

    protected override void OnAttachedTo(Entry entry)
    {
        base.OnAttachedTo(entry);
        entry.TextChanged += HandleTextChanged;
        entry.Keyboard = Keyboard.Numeric;
        entry.Text = "0,00"; // 初始默认显示
    }

    protected override void OnDetachingFrom(Entry entry)
    {
        base.OnDetachingFrom(entry);
        entry.TextChanged -= HandleTextChanged;
    }

    private void HandleTextChanged(object sender, TextChangedEventArgs e)
    {
        var entry = sender as Entry;
        if (entry == null) return;

        // 过滤所有非数字字符,只保留输入的数字
        var inputDigits = new string(e.NewText.Where(char.IsDigit).ToArray());

        // 处理删除操作:新输入的数字长度更短,说明用户删除了字符
        if (inputDigits.Length < _rawDigits.Length)
        {
            _rawDigits = _rawDigits.Substring(0, _rawDigits.Length - 1);
        }
        else
        {
            // 追加新增的数字(避免重复处理已输入的字符)
            _rawDigits += inputDigits.Substring(_rawDigits.Length);
        }

        // 将原始数字转换为金额:视为分,除以100得到元
        decimal amount = string.IsNullOrEmpty(_rawDigits) ? 0 : decimal.Parse(_rawDigits) / 100;

        // 格式化为带两位小数的字符串,使用逗号分隔
        entry.Text = amount.ToString("N2", _commaDecimalCulture);

        // 强制光标移到文本末尾,避免输入时光标错位
        entry.CursorPosition = entry.Text.Length;
    }
}

2. 在XAML中使用Behavior

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:YourAppNamespace"
             x:Class="YourAppNamespace.YourPage">
    <StackLayout Padding="20">
        <Entry Placeholder="请输入金额">
            <Entry.Behaviors>
                <local:DecimalFirstEntryBehavior />
            </Entry.Behaviors>
        </Entry>
    </StackLayout>
</ContentPage>

关键细节说明

  • 输入过滤:仅允许数字输入,自动忽略非数字字符(包括小数点),避免用户手动输入小数点导致逻辑混乱。
  • 光标处理:强制光标始终在文本末尾,保证输入体验流畅。
  • 文化适配:通过CultureInfo指定小数分隔符为逗号,若需要适配其他区域,可修改文化代码(如使用en-US则显示点分隔符)。
  • 边界处理:当用户删除所有输入时,自动恢复显示0,00。

内容的提问来源于stack exchange,提问作者JohanSolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:06:02