工作中遇到要在后台校验金额格式,草草看了下正则表达式,写了第一个
String regex_normal = "[0-9]{1,14}\\.{0,1}[0-9]{0,2}";//16位整数或小数(两位);
中括号[0-9]表示0到9这10个数字,花括号{1,14}表示可以出现次数为1到14次,后面同理。
其中小数点 \\. 第一个反斜杠是java的转义,第二个是对 . 的转义。
仔细看了下,发现有bug,对 1. 这样的金额也能通过。
改进一下
String regex_strict = "[0-9]{1,14}(\\.{0,1}[0-9]{1,2})?";//16位整数或小数(两位);
多了()?, ? 表示圆括号内容可惜重复1或0次。
测试源码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexpTest {
public static void main(String[] args){
Pattern pattern_normal;
Pattern pattern_strict;
String regex_normal = "[0-9]{1,14}\\.{0,1}[0-9]{0,2}";//16位整数或小数(两位);
String regex_strict = "[0-9]{1,14}(\\.{0,1}[0-9]{1,2})?";//16位整数或小数(两位);
String integer_1 = "1";
String integer_2 = "12";
String integer_3 = "123";
String float_1 = "1.2";
String float_2 = "1.23";
String float_3 = "1.234";
String float_0 = "1.";
pattern_normal = Pattern.compile(regex_normal);
pattern_strict = Pattern.compile(regex_strict);
System.out.println("pattern_normal 匹配 " + integer_1 + " :" + pattern_normal.matcher(integer_1).matches());
System.out.println("pattern_strict 匹配 " + integer_1 + " :" + pattern_strict.matcher(integer_1).matches());
System.out.println("pattern_normal 匹配 " + integer_2 + " :" + pattern_normal.matcher(integer_2).matches());
System.out.println("pattern_strict 匹配 " + integer_2 + " :" + pattern_strict.matcher(integer_2).matches());
System.out.println("pattern_normal 匹配 " + integer_3 + " :" + pattern_normal.matcher(integer_3).matches());
System.out.println("pattern_strict 匹配 " + integer_3 + " :" + pattern_strict.matcher(integer_3).matches());
System.out.println("pattern_normal 匹配 " + float_0 + " :" + pattern_normal.matcher(float_0).matches());
System.out.println("pattern_strict 匹配 " + float_0 + " :" + pattern_strict.matcher(float_0).matches());
System.out.println("pattern_normal 匹配 " + float_1 + " :" + pattern_normal.matcher(float_1).matches());
System.out.println("pattern_strict 匹配 " + float_1 + " :" + pattern_strict.matcher(float_1).matches());
System.out.println("pattern_normal 匹配 " + float_2 + " :" + pattern_normal.matcher(float_2).matches());
System.out.println("pattern_strict 匹配 " + float_2 + " :" + pattern_strict.matcher(float_2).matches());
System.out.println("pattern_normal 匹配 " + float_3 + " :" + pattern_normal.matcher(float_3).matches());
System.out.println("pattern_strict 匹配 " + float_3 + " :" + pattern_strict.matcher(float_3).matches());
}
}
输出:
pattern_normal 匹配 1 :true
pattern_strict 匹配 1 :true
pattern_normal 匹配 12 :true
pattern_strict 匹配 12 :true
pattern_normal 匹配 123 :true
pattern_strict 匹配 123 :true
pattern_normal 匹配 1. :true
pattern_strict 匹配 1. :false
pattern_normal 匹配 1.2 :true
pattern_strict 匹配 1.2 :true
pattern_normal 匹配 1.23 :true
pattern_strict 匹配 1.23 :true
pattern_normal 匹配 1.234 :false
pattern_strict 匹配 1.234 :false
还想对0 0.0 0.00这样的金额过滤,暂时不知道怎么写,希望高手帮忙。现在暂时是先格式校验通过后再用数值和0比较。
分享到:
相关推荐
一个WinForm程序用以测试C#正则表达式文本框验证:只能输入整数和带两位小数的小数。如暂时无法下载,可以查看本人CSDN博客里相应文章中关于该程序的思路。能力有限,仅供交流学习,请多多指教。
验证三位以内小数 - **表达式**: `^[0-9]+(.[0-9]{1,3})?$` - **描述**: 用于验证最多保留三位小数的数字。 ### 14. 验证正整数 - **表达式**: `^\+?[1-9][0-9]*$` - **描述**: 用于验证正整数。 ### 15. 验证负...
- **匹配正整数(三位以内):** `^([1-9][0-9]*){1,3}$` - 只匹配1到999之间的数字。 - **匹配正整数(含加号):** `^\+?[1-9][0-9]*$` - 允许数字前面有加号。 - **匹配负整数:** `^-\d+$` - 只匹配负整数。 - *...
- **解释**:用于验证金额格式,支持最大整数部分为51位(第一位非零),小数部分最多两位。 - **应用场景**:广泛应用于财务系统中的金额输入校验。 5. **金额位数限制**: `/^(([1-9]\d{0,11})|0)(\.\d{1,2})?$/...
在进行除法运算时,为了确保结果是两位小数,采用了四舍五入的方法。 用户通过Scanner类的Sc()方法输入他们的答案,程序会验证输入是否符合数字格式。如果输入是"T"或"t",则会输出当前的正确率;如果输入是"Q"或"q...
- **`zeroClear`方法**:该方法使用正则表达式和字符串的`replace`方法,清理如“零拾”、“零佰”、“零仟”等不必要的组合,同时确保不会出现连续的“零”。 - **`divide`和`convert`方法**:这两个方法紧密配合...
匹配不以4和7结尾的手机号码,可以使用正则表达式1\d{9}[0-3,5-6,8-9]。这个表达式的意思是,以1开头,后跟任意一个数字0-9,然后是9个任意数字,最后是一个不在4和7结尾的数字。 9. 矩阵转一维向量: 使用递推式将...
这些规则通过正则表达式在转换后的字符串上进行匹配和替换来实现。 ```java return res.replaceAll("零[拾佰仟]", "零") .replaceAll("零+亿", "亿").replaceAll("零+万", "万") .replaceAll("零+元", "元")....