如何将输入框阿拉伯数字转为英文数字,解决输入阿拉伯数字导致应用闪退问题
问题修复方案
根因说明
- 现有转换逻辑仅在提交按钮点击时触发,且字典覆盖的阿拉伯数字变体不全,未转换的非英文数字传入
int.Parse时会直接抛出格式异常导致崩溃 - 转换方法未做空值校验,若输入框内容为空时调用
Replace方法会触发空引用异常 - 空值补0逻辑顺序错误,若输入为空会先追加空换行,极端场景下会导致后续取最后一行文本时解析失败
修复步骤
1. 新增输入实时转换逻辑
给两个输入框Entnum1、Entnum2绑定TextChanged事件,输入过程中自动将阿拉伯/波斯数字转为英文数字,同时过滤非数字字符,用户输入时就能看到转换后的结果:
private void EntNum_TextChanged(object sender, TextChangedEventArgs e) { var entry = sender as Entry; if (string.IsNullOrEmpty(entry.Text)) return; StringBuilder newText = new StringBuilder(); foreach (char c in entry.Text) { // 转换阿拉伯数字(U+0660~U+0669) if (c >= '٠' && c <= '٩') { newText.Append((char)('0' + (c - '٠'))); } // 转换波斯数字(U+06F0~U+06F9) else if (c >= '۰' && c <= '۹') { newText.Append((char)('0' + (c - '۰'))); } // 保留英文数字和控制字符(删除、光标移动等) else if (char.IsDigit(c) || char.IsControl(c)) { newText.Append(c); } } // 避免循环触发事件 if (newText.ToString() != entry.Text) { entry.Text = newText.ToString(); entry.CursorPosition = entry.Text.Length; } }
2. 修复提交逻辑
调整空值处理顺序,用int.TryParse替代int.Parse彻底避免解析崩溃,原有ARCH转换方法可直接删除:
private async void btnRegister_Clicked(object sender, EventArgs e) { try { scrollView.HeightRequest = num1.HeightRequest; scroll = false; // 先处理输入空值,默认补0 string input1 = string.IsNullOrEmpty(Entnum1.Text) ? "0" : Entnum1.Text; string input2 = string.IsNullOrEmpty(Entnum2.Text) ? "0" : Entnum2.Text; // 追加到文本控件 num1.Text += "\n" + input1; num2.Text += "\n" + input2; // 安全解析数字累加 if (int.TryParse(input1, out int add1)) SUM1 += add1; if (int.TryParse(input2, out int add2)) SUM2 += add2; // 剩余原有逻辑保持不变 // ... } catch (Exception ex) { await DisplayAlert("Opps!", ex.Message, "Ok"); await Navigation.PopAsync(); } }
3. 可选强化限制
给两个输入框设置Keyboard = Keyboard.Numeric,弹出系统数字键盘,从输入源头减少非数字内容输入的可能。
内容的提问来源于stack exchange,提问作者TariqAlsunaydih
相关产品推荐
相关产品推荐

