我有一个带有文本框控件的Windows窗体应用程序,我只想接受整数值.在过去,我通过重载KeyPress事件并删除不符合规范的字符来完成这种验证.我看过MaskedTextBox控件,但是我想要一个更通用的解决方案,可以使用正则表达式,或者依赖于其他控件的值.
理想情况下,这将表现为按下非数字字符将不产生结果或立即向用户提供关于无效字符的反馈.
我经常Char.IsDigit用来检查a char是否是一个在LINQ查询中特别方便的数字,以便int.Parse在此处进行预检:"123".All(Char.IsDigit).
但是有些字符是数字,但无法解析为int喜欢?.
// true
bool isDigit = Char.IsDigit('?');
var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
int num;
// false
bool isIntForAnyCulture = cultures
.Any(c => int.TryParse('?'.ToString(), NumberStyles.Any, c, out num));
Run Code Online (Sandbox Code Playgroud)
这是为什么?我的int.Parse-precheck Char.IsDigit因此不正确吗?
有310个字符是数字:
List<char> digitList = Enumerable.Range(0, UInt16.MaxValue)
.Select(i => Convert.ToChar(i))
.Where(c => Char.IsDigit(c))
.ToList();
Run Code Online (Sandbox Code Playgroud)
这是Char.IsDigit.NET 4(ILSpy)中的实现:
public static bool IsDigit(char c)
{
if (char.IsLatin1(c))
{
return c >= '0' && c <= '9';
}
return …Run Code Online (Sandbox Code Playgroud)