.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; }
额外配置建议
给Entry设置合适的键盘类型,确保输入法能弹出对应语言的数字键盘:
<Entry x:Name="EntryControl" Keyboard="Decimal" TextChanged="EntryControl_TextChanged" />Keyboard="Decimal"会根据系统文化自动切换小数点分隔符的输入键,配合正则校验就能实现完整适配。如果需要强制使用特定文化(而非跟随系统),可以手动设置
CultureInfo,比如强制德语:CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE"); CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("de-DE");
关于默认行为
.NET MAUI的Entry控件本身不会自动处理这种自定义的输入格式校验,默认情况下Keyboard="Decimal"会适配系统文化的分隔符输入,但如果自己写了TextChanged的校验逻辑,就必须手动适配CultureInfo,否则会出现你遇到的硬编码匹配问题。
内容的提问来源于stack exchange,提问作者OXO
相关产品推荐
相关产品推荐

