当界面上要用户输入只有数字的字符时,默认的Textbox是不能胜任的,网上有很多网友们提供了很多的做法,我总结了一下写了一个在C#下的实现,做到了如下的几点:
1:只能输入类似这样的字符:-123456.789;1234.789;
2:在输入的字符串中不能存在两个点符:12456.78//正确;12.456.78//不正确;
3:如果表示负数可以在字符串的最前面加一个减号“-”,也只能加到弟一个字符的位置;
4:可以用复制粘帖功能和菜单功能,但是只对能正确格式的字符串有效,比如:12.34可以,Abc不可以;
5:只是得到一个字符串,还可以在这个基础上再改进自己所需的,比如添加对十六进制的支持等。
代码如下在.NET下用C#写的:

using System;
using System.Windows.Forms;

namespace NumTextBox
{
 /// <summary>
 /// NumTextBox 的摘要说明。
 /// </summary>
 public class TextBoxNumEx:System.Windows.Forms.TextBox
 {
  public const int WM_CONTEXTMENU = 0x007b;//右键菜单消息 
  public const int WM_CHAR = 0x0102;       //输入字符消息(键盘输入的,输入法输入的好像不是这个消息)
  public const int WM_CUT = 0x0300;        //程序发送此消息给一个编辑框或combobox来删除当前选择的文本
  public const int WM_COPY = 0x0301;       //程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
  public const int WM_PASTE = 0x0302;      //程序发送此消息给editcontrol或combobox从剪贴板中得到数据
  public const int WM_CLEAR = 0x0303;      //程序发送此消息给editcontrol或combobox清除当前选择的内容;
  public const int WM_UNDO = 0x0304;        //程序发送此消息给editcontrol或combobox撤消最后一次操作

public TextBoxNumEx()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  protected override void WndProc(ref Message m)
  {
   switch(m.Msg)
   {
    case WM_CHAR:
     System.Console.WriteLine(m.WParam);
     bool isSign = ((int)m.WParam == 45);
     bool isNum = ((int)m.WParam >= 48) && ((int)m.WParam <= 57);
     bool isBack = (int)m.WParam == (int)Keys.Back;
     bool isDelete = (int)m.WParam == (int)Keys.Delete;//实际上这是一个"."键
     bool isCtr = ((int)m.WParam == 24) || ((int)m.WParam == 22) || ((int)m.WParam == 26) ||((int)m.WParam == 3);

if( isNum || isBack || isCtr)
     {
      base.WndProc (ref m);
     }
     if (isSign)
     {
      if (this.SelectionStart!=0)
      {
       break;
      }
      base.WndProc (ref m);
      break;
     }
     if (isDelete)
     {
      if (this.Text.IndexOf(".")<0)
      {
       base.WndProc (ref m);
      }
     }
     if ((int)m.WParam == 1)
     {
      this.SelectAll();
     }
     break;
    case WM_PASTE:
     IDataObject iData = Clipboard.GetDataObject();//取剪贴板对象
     
     if(iData.GetDataPresent(DataFormats.Text)) //判断是否是Text
     {
      string str = (string)iData.GetData(DataFormats.Text);//取数据
      if (MatchNumber(str))
      {
       base.WndProc (ref m);
       break;
      }
     }
     m.Result = (IntPtr)0;//不可以粘贴
     break;
    default:
     base.WndProc (ref m);
     break;
   }
  }
  private bool MatchNumber(string ClipboardText)
  {
   int index=0;
   string strNum = "-0.123456789";

index = ClipboardText.IndexOf(strNum[0]);
   if (index>=0)
   {
    if (index>0)
    {
     return false;
    }
    index = this.SelectionStart;
    if (index>0)
    {
     return false;
    }
   }

index = ClipboardText.IndexOf(strNum[2]);
   if (index!=-1)
   {
    index = this.Text.IndexOf(strNum[2]);
    if (index!=-1)
    {
     return false;
    }
   }

for(int i=0; i<ClipboardText.Length; i++)
   {
    index = strNum.IndexOf(ClipboardText[i]);
    if (index <0)
    {
     return false;
    }
   }
   return true;
  }
 }
}

只能对数值操作的TextBox相关推荐

  1. 【C++】C++11 STL算法(七):排列操作(Permutation operations)、数值操作(Numeric operations)

    排列操作(Permutation operations) 一.is_permutation 1.原型: template< class ForwardIt1, class ForwardIt2 ...

  2. [转]python类型转换、数值操作

    http://canofy.iteye.com/blog/298263# python类型转换 Python代码   函数                      描述 int(x [,base ] ...

  3. python类型转换、数值操作

    我去,Python也有类型转换!!!因为Python作为动态语言,有延迟定义的功能,但作为强类型语言,类型一旦确定便固定,类型转换需要显示的类型转换操作. 原文:http://www.cnblogs. ...

  4. python类型数值操作

    python类型转换 函数                      描述 int(x [,base ])         将x转换为一个整数 long(x [,base ])        将x转换 ...

  5. python数值运算实例_“每天进步一点点”案例学习python数值操作

    这是树哥讲python系列的第四篇文章. 本质上计算机熟悉的是二进制,也就是我们常说的"0,1"代码,所以无论是执行的命令还是数据本身,都必须转化为0和1他们才会认知.而我们熟悉的 ...

  6. python字符串拼接数字_python字符串和数值操作函数大全(非常全)

    字符串和数值型数字的操作大全 1.反斜杠\的使用规则:一般使用表示续行的操作,可以其他符号相结合组成其他的一些使用符号,转义字符\'的使用会识别引号,使得字符串中的引号和外面本来的啊引号相区分. (1 ...

  7. narray删除列 python_Python数据分析入门教程(四):数值操作

    作者 | CDA数据分析师 我们把菜品挑选出来以后,就可以开始切菜了.比如要做凉拌黄瓜丝,把黄瓜找出来以后,那就可以把黄瓜切成丝了. 一.数值替换 数值替换就是将数值A替换成B,可以用在异常值替换处理 ...

  8. python实现将文件内容按照某一列内容的大小值重新排序_Python数据分析入门教程(四):数值操作...

    作者 | CDA数据分析师 我们把菜品挑选出来以后,就可以开始切菜了.比如要做凉拌黄瓜丝,把黄瓜找出来以后,那就可以把黄瓜切成丝了. 一.数值替换 数值替换就是将数值A替换成B,可以用在异常值替换处理 ...

  9. php数值操作,php数值计算num类简单操作示例

    php数值计算num类简单操作示例,在线,计算器,小数,整数,程序设计 php数值计算num类简单操作示例 易采站长站,站长之家为您整理了php数值计算num类简单操作示例的相关内容. 本文实例讲述了 ...

最新文章

  1. Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK
  2. java 栈 先进后出_数据结构: 先进后出——堆栈
  3. php中sha1,PHP中sha1()函数和md5()函数的绕过
  4. CentOS7没有telnet命令的解决方法
  5. 【MyBatis框架】mybatis入门
  6. Delphi 的内存操作函数(1): 给字符指针分配内存
  7. VMware Fusion中使用迅雷的问题
  8. 统计图源代码_openlayers4 入门开发系列结合 echarts4 实现统计图(附源码下载)
  9. webservice 完整视频教程
  10. 华为U2000网管研究实录 (2) - 数据库与第三方组件
  11. java弹出子窗口_java实现点击按钮事件弹出子窗口
  12. 微型计算机上的tab作用,TAB键有什么用处
  13. 利用python对包含离散型特征和连续型特征的数据进行预处理
  14. vue中使用萤石云播放视频
  15. set(gca,'fontsize',8);
  16. Java 实现用户登录项目
  17. 2:STM32CubeMX配置STM32F103C8T6驱动-TIM1配置
  18. GridView ---->Indicator
  19. uni-app实现验证码登录-云之讯
  20. 关于使用讯搜(xunsearch)过程中遇到的坑

热门文章

  1. 《第一次遇见系列——win10家庭版重装系统后win+a(操作中心消失)的几种解决方法》
  2. 判断浏览器类型 是否是微信浏览器
  3. python三目运算符_Python 三目运算符
  4. 弘辽科技:如何拍摄出效果好的淘宝主图?商品主图的基本要求有?
  5. 【Java基础知识 2】配置java环境变量
  6. 外婆去世了,我不能回去为她老人家送行!
  7. 2018电赛A题记录
  8. 360安全路由开启预约 双频路由器售价99元
  9. centos7 top命令详解
  10. 华为鸿蒙流畅好吗,华为鸿蒙系统有什么优点-华为鸿蒙系统好用吗?