/**
* 入口方法
* 给定整数和小数位数进行用户输入验证 * @param text 传入的Text控件对象 * @param integerNum 要求输入的整数部分的位数,如果不限制则输入-1 * @param fractionNum 要求输入的小数部分的位数,如果不限制则输入-1 * @param isPositive 是否形成正数,true 正数和零,false负数和零 */ public VerifyText(Text text, int integerNum, int fractionNum, boolean isPositive) { this.text = text; UpperCaseVerifyListener upperCaseVerifyListener = (UpperCaseVerifyListener) text.getData( "UpperCaseVerifyListener"); if (upperCaseVerifyListener != null) { this.text.removeVerifyListener(upperCaseVerifyListener); this.text.setData("UpperCaseVerifyListener", null); } RegExpVerifyListener regExpVerifyListener = null; regExpVerifyListener = (RegExpVerifyListener) this.text.getData("DigitVerifyListener"); if (regExpVerifyListener != null) { this.text.removeVerifyListener(regExpVerifyListener); this.text.setData("DigitVerifyListener", null); } this.integerNum = integerNum; this.fractionNum = fractionNum; this.regExp = populateRegExp(isPositive) + "|" + "(0)"; regExpVerifyListener = new RegExpVerifyListener(); this.text.addVerifyListener(regExpVerifyListener); this.text.setData("DigitVerifyListener", regExpVerifyListener); if (upperCaseVerifyListener != null) { this.text.addVerifyListener(upperCaseVerifyListener); this.text.setData("UpperCaseVerifyListener", upperCaseVerifyListener); } } /** * 给定整数和小数位数进行用户输入验证(正负数,零均可) * @param text 传入的Text控件对象 * @param integerNum 要求输入的整数部分的位数,如果不限制则输入-1 * @param fractionNum 要求输入的小数部分的位数,如果不限制则输入-1 */ public VerifyText(Text text, int integerNum, int fractionNum) { this.text = text; UpperCaseVerifyListener upperCaseVerifyListener = (UpperCaseVerifyListener) text.getData( "UpperCaseVerifyListener"); if (upperCaseVerifyListener != null) { this.text.removeVerifyListener(upperCaseVerifyListener); this.text.setData("UpperCaseVerifyListener", null); } RegExpVerifyListener regExpVerifyListener = null; regExpVerifyListener = (RegExpVerifyListener) this.text.getData("DigitVerifyListener"); //$NON-NLS-1$ if (regExpVerifyListener != null) { this.text.removeVerifyListener(regExpVerifyListener); this.text.setData("DigitVerifyListener", null); } this.integerNum = integerNum; this.fractionNum = fractionNum; this.regExp = populateRegExp(true) + "|" + "(0)" + "|" + populateRegExp(false); ; //新建监听,将新建的class的参数传入新建的监听 regExpVerifyListener = new RegExpVerifyListener(); this.text.addVerifyListener(regExpVerifyListener); this.text.setData("DigitVerifyListener", regExpVerifyListener); if (upperCaseVerifyListener != null) { this.text.addVerifyListener(upperCaseVerifyListener); this.text.setData("UpperCaseVerifyListener", upperCaseVerifyListener); } } //确定正则规则 private String populateRegExp(boolean isPositive) { StringBuffer buffer = new StringBuffer(); buffer.append("^"); buffer.append(!isPositive ? "(-)|" : ""); if (integerNum == -1) { buffer.append("(" + (!isPositive ? "-" : "") + "[1-9]\\d*" + ")"); buffer.append("|"); } else if (integerNum > 0) { buffer.append("(" + (!isPositive ? "-" : "") + "[1-9]\\d{0," + (integerNum - 1) + "}" + ")"); buffer.append("|"); } if (fractionNum == -1) { if (integerNum == -1) { buffer.append("(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + ")"); } else if (integerNum > 0) { buffer.append( "(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + ")"); } buffer.append("|"); if (integerNum == -1) { buffer.append("(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + "\\d*" + ")"); } else if (integerNum > 0) { buffer.append( "(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + "\\d*" + ")"); //$NON-NLS-1$ } } else if (fractionNum > 0) { if (integerNum == -1) { buffer.append("(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + ")"); } else if (integerNum > 0) { buffer.append( "(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + ")"); } buffer.append("|"); if (integerNum == -1) { buffer.append( "(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + "\\d{0," + (fractionNum - 1) + "}" + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } else if (integerNum > 0) { buffer.append( "(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + "\\d{0," + fractionNum + "}" + ")"); } } buffer.append("$"); return buffer.toString(); } //执行的监听 private class RegExpVerifyListener implements VerifyListener { public void verifyText(VerifyEvent e) { if (e.doit == true) { e.doit = false; if (fractionNum == -1 || fractionNum > 0) { if (e.text.contains("。")) { e.text = e.text.replace("。", "."); } } String inputStr = e.text; String originalStr = text.getText(); int start = e.start; int end = e.end; /** * start == end 插入模式 * start < end 替换模式 */ String resultStr = originalStr.substring(0, start) + inputStr + originalStr.substring(end); if ("".equals(resultStr)) { e.doit = true; return; } else { Pattern pattern = Pattern.compile(regExp); if (pattern.matcher(resultStr).matches()) { e.doit = true; return; } } } } } /** * Launch the application * @param args */ public static void main(String[] args) { final Display display = Display.getDefault(); final Shell shell = new Shell(); shell.setSize(500, 375); shell.setText("SWT Application"); //$NON-NLS-1$ // shell.open(); Text text = new Text(shell, SWT.BORDER); new VerifyText(text, 2, 0); text.setBounds(175, 110, 120, 30); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } }}