出生日期输入格式化显示与合法性校验技术问询
出生日期格式化与合法性校验实现
需求明确
- 输入:无分隔符数字字符串(如
15022000,格式为DDMMYYYY) - 输出:格式化为
DD-MM-YYYY样式(如15-02-2000) - 合法性校验规则:
- 日期部分≤31
- 月份部分≤12
- 年份需满足
2010 < 年份 < 2023
原代码(中文注释版)
private void AgeValueChanged(string s_value) { // 清理输入:移除所有非数字字符,空值处理为空字符串 string snum = System.Text.RegularExpressions.Regex.Replace(s_value, @"[^0-9]", string.Empty) ?? string.Empty; // 限制最大长度为8位(原逻辑注释为美国手机号规则,此处仅保留长度限制) if (snum.Length > 8) snum = snum.Substring(0, 8); // 按自定义规则格式化 if (snum.Length < 2) { // 不做处理 } else if(snum.Length == 2) { snum = $"{snum}"; } else if (snum.Length <= 4) { snum = $"{snum.Substring(0, 2)} / {snum.Substring(2, snum.Length - 2)}"; } else { snum = $"{snum.Substring(0, 2)} / {snum.Substring(2, 2)} / {snum.Substring(4, snum.Length - 4)}"; } ageInputField.text = snum; // 如果文本长度变化,将光标移到末尾(可根据需求修改行为) if (snum.Length != s_value.Length) { ageInputField.ForceLabelUpdate(); ageInputField.MoveTextEnd(false); } }
原代码问题说明
原代码是针对手机号格式的处理逻辑,不符合当前需求的点包括:
- 使用
/作为分隔符,而非需求要求的- - 未实现任何日期合法性校验逻辑
- 注释内容与出生日期处理场景不匹配
修改后的完整实现代码
private void AgeValueChanged(string s_value) { // 清理输入:只保留数字,空值处理为空字符串 string snum = System.Text.RegularExpressions.Regex.Replace(s_value, @"[^0-9]", string.Empty) ?? string.Empty; // 限制最大长度为8位(DDMMYYYY格式) if (snum.Length > 8) snum = snum.Substring(0, 8); // 按需求逐步格式化字符串 string formattedDate = snum; if (snum.Length >= 2 && snum.Length < 4) { formattedDate = $"{snum.Substring(0, 2)}-{snum.Substring(2)}"; } else if (snum.Length >= 4) { string dayPart = snum.Substring(0, 2); string monthPart = snum.Substring(2, 2); string yearPart = snum.Length > 4 ? snum.Substring(4) : string.Empty; // 拼接基础格式 formattedDate = $"{dayPart}-{monthPart}"; if (!string.IsNullOrEmpty(yearPart)) { formattedDate = $"{formattedDate}-{yearPart}"; } } ageInputField.text = formattedDate; // 输入过程中自动将光标移到末尾,保持流畅体验 if (formattedDate.Length != s_value.Length) { ageInputField.ForceLabelUpdate(); ageInputField.MoveTextEnd(false); } // 当输入完整8位时,执行合法性校验 if (snum.Length == 8) { bool isValid = ValidateBirthDate(snum, out string errorMsg); // 可根据校验结果做UI提示,比如设置输入框颜色、显示错误文本 // 示例:ageInputField.image.color = isValid ? Color.white : Color.red; // errorText.text = isValid ? string.Empty : errorMsg; } } /// <summary> /// 校验出生日期合法性 /// </summary> /// <param name="dateStr">8位无分隔符日期字符串(DDMMYYYY)</param> /// <param name="errorMsg">错误信息</param> /// <returns>是否合法</returns> private bool ValidateBirthDate(string dateStr, out string errorMsg) { errorMsg = string.Empty; // 拆分并转换日、月、年 if (!int.TryParse(dateStr.Substring(0, 2), out int day) || !int.TryParse(dateStr.Substring(2, 2), out int month) || !int.TryParse(dateStr.Substring(4, 4), out int year)) { errorMsg = "日期格式无效"; return false; } // 校验月份范围 if (month < 1 || month > 12) { errorMsg = "月份必须在1-12之间"; return false; } // 校验日期范围 if (day < 1 || day > 31) { errorMsg = "日期必须在1-31之间"; return false; } // 校验年份范围 if (year <= 2010 || year >= 2023) { errorMsg = $"年份必须在2011-2022之间"; return false; } // 精确校验日期有效性(避免如2月30日这类不存在的日期) try { _ = new DateTime(year, month, day); } catch { errorMsg = "日期不存在(如2月30日)"; return false; } return true; }
代码说明
- 输入处理与格式化:实时清理非数字输入,按输入长度逐步添加
-分隔符,匹配需求的显示格式 - 合法性校验:
- 输入完整8位时自动触发校验
- 分别校验日、月、年的范围,同时添加精确日期有效性校验
- 输出错误信息,方便后续做UI提示
- 交互优化:输入过程中自动将光标移到末尾,保证流畅的输入体验
内容的提问来源于stack exchange,提问作者duc
相关产品推荐
相关产品推荐

