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

.NET MAUI Entry控件TextChanged事件多语言小数点适配问题

.NET MAUI Entry控件适配系统文化的小数点分隔符解决方案

你的问题出在硬编码了小数点分隔符的匹配规则,没有根据当前系统的CultureInfo动态获取正确的分隔符,同时正则表达式的写法也限制了输入。以下是具体的修改方案:

核心修改点

  • 动态获取当前系统的小数点分隔符(从CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator获取)
  • 调整正则表达式,用动态获取的分隔符替代固定的[.,]
  • 优化光标位置处理,避免因文本回滚导致的光标错位

修改后的代码

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

    var input = entry.Text;
    if (string.IsNullOrEmpty(input))
    {
        return;
    }

    // 获取当前系统的小数点分隔符
    var decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    // 转义正则特殊字符(统一处理分隔符的正则适配)
    var escapedSeparator = Regex.Escape(decimalSeparator);

    // 构建适配当前文化的正则规则:允许0、0+分隔符+小数、正整数+可选分隔符+小数
    var pattern = $"^(0|0{escapedSeparator}[0-9]*|[1-9]+{escapedSeparator}?[0-9]*)$";
    var match = Regex.Match(input, pattern);

    if (!match.Success)
    {
        entry.Text = e.OldTextValue;
        // 回滚文本后,光标位置设置为旧文本长度,避免光标错位
        entry.CursorPosition = e.OldTextValue?.Length ?? 0;
        return;
    }

    entry.CursorPosition = input.Length;
}

额外配置建议

  1. 给Entry设置合适的键盘类型,确保输入法能弹出对应语言的数字键盘:

    <Entry x:Name="EntryControl" 
           Keyboard="Decimal"
           TextChanged="EntryControl_TextChanged" />
    

    Keyboard="Decimal"会根据系统文化自动切换小数点分隔符的输入键,配合正则校验就能实现完整适配。

  2. 如果需要强制使用特定文化(而非跟随系统),可以手动设置CultureInfo,比如强制德语:

    CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
    CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("de-DE");
    

关于默认行为

.NET MAUI的Entry控件本身不会自动处理这种自定义的输入格式校验,默认情况下Keyboard="Decimal"会适配系统文化的分隔符输入,但如果自己写了TextChanged的校验逻辑,就必须手动适配CultureInfo,否则会出现你遇到的硬编码匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:20:43