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

Xamarin.Android(C#):输入时为EditText文本添加分隔符的方法

解决EditText AfterTextChanged中无法输入小数点的问题

我太懂这个痛点了——输入小数点时刚敲完就被格式化掉,根本没法开始输入小数部分。这是因为当文本是纯.、.xxx这类不完整的小数状态时,double.TryParse会直接把它解析成0,格式化后就变成了不带小数点的字符串,直接覆盖了你的输入。

给你调整后的代码方案,专门处理这些特殊的输入状态:

double value = 0;
string currentText = Text;

// 情况1:用户只输入了小数点".",直接保留,让用户可以继续输入小数部分
if (currentText.Equals("."))
{
    SetSelection(currentText.Length);
    return;
}

// 情况2:用户输入了".xxx"(开头是小数点的不完整小数),补0后再格式化
else if (currentText.StartsWith(".") && currentText.Length > 1)
{
    string correctedText = "0" + currentText;
    if (double.TryParse(correctedText, NumberStyles.Any, this.InternalCulture, out value))
    {
        string formattedString = NumberFormat.GetNumberInstance(CultureInfo).Format(value);
        Text = formattedString;
        SetSelection(Text.Length);
    }
    return;
}

// 情况3:用户输入了"xxx."(末尾带小数点的不完整小数),保留小数点
else if (currentText.EndsWith(".") && currentText.Length > 1)
{
    // 先验证去掉小数点后的部分是有效数字,再保留原文本
    if (double.TryParse(currentText.TrimEnd('.'), NumberStyles.Any, this.InternalCulture, out _))
    {
        SetSelection(currentText.Length);
        return;
    }
}

// 正常完整数值的格式化逻辑
if (double.TryParse(currentText, NumberStyles.Any, this.InternalCulture, out value))
{
    string formattedString = NumberFormat.GetNumberInstance(CultureInfo).Format(value);
    if (!formattedString.Equals(currentText))
    {
        Text = formattedString;
    }
    SetSelection(Text.Length);
}

代码说明:

  1. 纯小数点处理:当用户只输入.时,跳过格式化逻辑,直接定位光标,让用户可以继续输入小数位。
  2. 开头小数点处理:比如输入.123时,自动补成0.123再格式化,既符合数值规范,又不会吃掉用户的输入意图。
  3. 末尾小数点处理:输入123.时,保留这个小数点,让用户可以继续输入后续的小数部分,不会被格式化回123。
  4. 正常数值处理:对于完整的数值(比如123.45),依然保留你原来的格式化逻辑,确保显示符合文化格式要求。

这样调整后,用户输入小数的整个流程就顺畅了,不会再出现小数点被莫名吃掉的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:17:50