Java 判断是否是整数,小数或实数

朱雀 2021-02-15 14:31 644阅读 0赞

经常会遇到这样的情况,需要判断一个字符串是否是一个合法的数,包括整数,小数或者实数。

网上查到很多文章大多是判断这个字符串是否全为数字,比如下面这段来自StringUtils的代码,可以看到,13.2这样的数字实际上会返回false,可是,他的确是一个数字。

  1. public static boolean isNumeric(String str) {
  2. if (str == null) {
  3. return false;
  4. }
  5. int sz = str.length();
  6. for (int i = 0; i < sz; i++) {
  7. if (Character.isDigit(str.charAt(i)) == false) {
  8. return false;
  9. }
  10. }
  11. return true;
  12. }

当然,网上还能查到很多其他方式,诸如用正则表达式判断是否0-9,用字符ascii码判断是否是数字以及用Double.parseDouble()是否抛出异常来判断是否为数字。
事实上,除了最后一种方式能达到我们的要求,其他的都很难真正做到类似的判断。但是最后一种方式也很难区别出到底是正整数,负整数,正小数还是负小数,而且,捕获异常的方式实在是有些难看。

基于此原因,我自己写了一个工具类,专门用作数的检测,目前能够检测正整数,负整数,整数,正小数,负小数,小数以及实数,采用的仍然是正则表达式的方式,当然,如果有遗漏或者错误,欢迎联系我以便更正,同时也欢迎修改或使用这些代码以便符合你的应用场景。

可以简单讲下正则的思想以便修改,

  1. 对于正整数而言,可以带+号,第一个数字不能为0

  2. 对于负整数而言,必须带负号,第一个数字也不能为0

  3. 对于整数而言,实际是由0,正整数和负整数组成的,所以偷个懒用前两个方法一起判断

  4. 对于正小数而言,可以考带+号,并考虑两种情况,第一个数字为0和第一个数字不为0,第一个数字为0时,则小数点后面应该不为0,第一个数字不为0时,小数点后可以为任意数字

  5. 对于负小数而言,必须带负号,其余都同上

  6. 对于小数,可以带正负号,并且带小数点就行了,但是至少保证小数点有一边不为空,所以这里还是分左边不为空和右边不为空的情况

  7. 实数比较简单,,要么是整数,要么是小数

    1. package com.sap.cesp.creditinsight.web.app.util;
    2. import java.util.regex.Matcher;
    3. import java.util.regex.Pattern;
    4. public class NumberValidationUtils {
    5. private static boolean isMatch(String regex, String orginal){
    6. if (orginal == null || orginal.trim().equals("")) {
    7. return false;
    8. }
    9. Pattern pattern = Pattern.compile(regex);
    10. Matcher isNum = pattern.matcher(orginal);
    11. return isNum.matches();
    12. }
    13. public static boolean isPositiveInteger(String orginal) {
    14. return isMatch("^\\+{0,1}[1-9]\\d*", orginal);
    15. }
    16. public static boolean isNegativeInteger(String orginal) {
    17. return isMatch("^-[1-9]\\d*", orginal);
    18. }
    19. public static boolean isWholeNumber(String orginal) {
    20. return isMatch("[+-]{0,1}0", orginal) || isPositiveInteger(orginal) || isNegativeInteger(orginal);
    21. }
    22. public static boolean isPositiveDecimal(String orginal){
    23. return isMatch("\\+{0,1}[0]\\.[1-9]*|\\+{0,1}[1-9]\\d*\\.\\d*", orginal);
    24. }
    25. public static boolean isNegativeDecimal(String orginal){
    26. return isMatch("^-[0]\\.[1-9]*|^-[1-9]\\d*\\.\\d*", orginal);
    27. }
    28. public static boolean isDecimal(String orginal){
    29. return isMatch("[-+]{0,1}\\d+\\.\\d*|[-+]{0,1}\\d*\\.\\d+", orginal);
    30. }
    31. public static boolean isRealNumber(String orginal){
    32. return isWholeNumber(orginal) || isDecimal(orginal);
    33. }
    34. }

    测试用例如下:

    1. package com.sap.cesp.creditinsight.web.app.util;
    2. import junit.framework.Assert;
    3. import org.junit.Test;
    4. public class NumberValidationUtilsTest {
    5. /**
    6. * Test method for {@link com.sap.cesp.creditinsight.web.app.util.NumberValidationUtils#isPositiveInteger(java.lang.String)}
    7. */
    8. //correct test case: 1, 87653521123567
    9. //wrong test case: 0.1, 0, 0123, -1, -0.1, ab
    10. @Test
    11. public void testIsPositiveInteger() {
    12. Assert.assertTrue(NumberValidationUtils.isPositiveInteger("1"));
    13. Assert.assertTrue(NumberValidationUtils.isPositiveInteger("+12"));
    14. Assert.assertTrue(NumberValidationUtils.isPositiveInteger("87653521123567"));
    15. Assert.assertFalse(NumberValidationUtils.isPositiveInteger("0.1"));
    16. Assert.assertFalse(NumberValidationUtils.isPositiveInteger("0"));
    17. Assert.assertFalse(NumberValidationUtils.isPositiveInteger("0123"));
    18. Assert.assertFalse(NumberValidationUtils.isPositiveInteger("-1"));
    19. Assert.assertFalse(NumberValidationUtils.isPositiveInteger("-0.1"));
    20. Assert.assertFalse(NumberValidationUtils.isPositiveInteger("ab"));
    21. }
    22. /**
    23. * Test method for {@link com.sap.cesp.creditinsight.web.app.util.NumberValidationUtils#isNegativeInteger(java.lang.String)}
    24. */
    25. //correct test case: -1, -87653521123567
    26. //wrong test case: 0.1, 0, 0123, 1, -0.1, -ab
    27. @Test
    28. public void testIsNegativeInteger() {
    29. Assert.assertTrue(NumberValidationUtils.isNegativeInteger("-1"));
    30. Assert.assertTrue(NumberValidationUtils.isNegativeInteger("-87653521123567"));
    31. Assert.assertFalse(NumberValidationUtils.isNegativeInteger("0.1"));
    32. Assert.assertFalse(NumberValidationUtils.isNegativeInteger("0"));
    33. Assert.assertFalse(NumberValidationUtils.isNegativeInteger("0123"));
    34. Assert.assertFalse(NumberValidationUtils.isNegativeInteger("1"));
    35. Assert.assertFalse(NumberValidationUtils.isNegativeInteger("-0.1"));
    36. Assert.assertFalse(NumberValidationUtils.isNegativeInteger("ab"));
    37. }
    38. /**
    39. * Test method for {@link com.sap.cesp.creditinsight.web.app.util.NumberValidationUtils#isWholeNumber(java.lang.String)}.
    40. */
    41. //correct test case: -1, 0, 1, 8673434231, -282464334
    42. //wrong test case: 0.1, 0123, -0.1, ab
    43. @Test
    44. public void testIsWholeNumber() {
    45. Assert.assertTrue(NumberValidationUtils.isWholeNumber("-1"));
    46. Assert.assertTrue(NumberValidationUtils.isWholeNumber("0"));
    47. Assert.assertTrue(NumberValidationUtils.isWholeNumber("1"));
    48. Assert.assertTrue(NumberValidationUtils.isWholeNumber("+12"));
    49. Assert.assertTrue(NumberValidationUtils.isWholeNumber("8673434231"));
    50. Assert.assertTrue(NumberValidationUtils.isWholeNumber("-282464334"));
    51. Assert.assertFalse(NumberValidationUtils.isWholeNumber("0123"));
    52. Assert.assertFalse(NumberValidationUtils.isWholeNumber("0.1"));
    53. Assert.assertFalse(NumberValidationUtils.isWholeNumber("-0.1"));
    54. Assert.assertFalse(NumberValidationUtils.isWholeNumber("ab"));
    55. }
    56. /**
    57. * Test method for {@link com.sap.cesp.creditinsight.web.app.util.NumberValidationUtils#isPositiveDecimal(java.lang.String)}
    58. */
    59. //correct test case: 0.1, 0.132213, 1.0
    60. //wrong test case: 1, 0.0, 0123, -1, -0.1
    61. @Test
    62. public void testIsPositiveDecimal() {
    63. Assert.assertTrue(NumberValidationUtils.isPositiveDecimal("0.1"));
    64. Assert.assertTrue(NumberValidationUtils.isPositiveDecimal("0.132213"));
    65. Assert.assertTrue(NumberValidationUtils.isPositiveDecimal("30.00"));
    66. Assert.assertTrue(NumberValidationUtils.isDecimal("0."));
    67. Assert.assertTrue(NumberValidationUtils.isPositiveDecimal("+12.0"));
    68. Assert.assertFalse(NumberValidationUtils.isPositiveDecimal("0123"));
    69. Assert.assertFalse(NumberValidationUtils.isPositiveDecimal("1"));
    70. Assert.assertFalse(NumberValidationUtils.isPositiveDecimal("0.0"));
    71. Assert.assertFalse(NumberValidationUtils.isPositiveDecimal("ab"));
    72. Assert.assertFalse(NumberValidationUtils.isPositiveDecimal("-1"));
    73. Assert.assertFalse(NumberValidationUtils.isPositiveDecimal("-0.1"));
    74. }
    75. /**
    76. * Test method for {@link com.sap.cesp.creditinsight.web.app.util.NumberValidationUtils#isNegativeDecimal(java.lang.String)}
    77. */
    78. //correct test case: -0.132213, -1.0
    79. //wrong test case: 1, 0, 0123, -1, 0.1
    80. @Test
    81. public void testIsNegativeDecimal() {
    82. Assert.assertTrue(NumberValidationUtils.isNegativeDecimal("-0.132213"));
    83. Assert.assertTrue(NumberValidationUtils.isNegativeDecimal("-1.0"));
    84. Assert.assertTrue(NumberValidationUtils.isDecimal("-0."));
    85. Assert.assertFalse(NumberValidationUtils.isNegativeDecimal("1"));
    86. Assert.assertFalse(NumberValidationUtils.isNegativeDecimal("0"));
    87. Assert.assertFalse(NumberValidationUtils.isNegativeDecimal("0123"));
    88. Assert.assertFalse(NumberValidationUtils.isNegativeDecimal("0.0"));
    89. Assert.assertFalse(NumberValidationUtils.isNegativeDecimal("ab"));
    90. Assert.assertFalse(NumberValidationUtils.isNegativeDecimal("-1"));
    91. Assert.assertFalse(NumberValidationUtils.isNegativeDecimal("0.1"));
    92. }
    93. /**
    94. * Test method for {@link com.sap.cesp.creditinsight.web.app.util.NumberValidationUtils#isDecimal(java.lang.String)}.
    95. */
    96. //correct test case: 0.1, 0.00, -0.132213
    97. //wrong test case: 1, 0, 0123, -1, 0., ba
    98. @Test
    99. public void testIsDecimal() {
    100. Assert.assertTrue(NumberValidationUtils.isDecimal("0.1"));
    101. Assert.assertTrue(NumberValidationUtils.isDecimal("0.00"));
    102. Assert.assertTrue(NumberValidationUtils.isDecimal("+0.0"));
    103. Assert.assertTrue(NumberValidationUtils.isDecimal("-0.132213"));
    104. Assert.assertTrue(NumberValidationUtils.isDecimal("0."));
    105. Assert.assertFalse(NumberValidationUtils.isDecimal("1"));
    106. Assert.assertFalse(NumberValidationUtils.isDecimal("0123"));
    107. Assert.assertFalse(NumberValidationUtils.isDecimal("0"));
    108. Assert.assertFalse(NumberValidationUtils.isDecimal("ab"));
    109. Assert.assertFalse(NumberValidationUtils.isDecimal("-1"));
    110. }
    111. /**
    112. * Test method for {@link com.sap.cesp.creditinsight.web.app.util.NumberValidationUtils#isRealNumber(java.lang.String)}.
    113. */
    114. //correct test case: 0.032213, -0.234, 0.0, 1, -1, 0
    115. //wrong test case: 00.13, ab, +0.14
    116. @Test
    117. public void testIsRealNumber() {
    118. Assert.assertTrue(NumberValidationUtils.isRealNumber("0.032213"));
    119. Assert.assertTrue(NumberValidationUtils.isRealNumber("-0.234"));
    120. Assert.assertTrue(NumberValidationUtils.isRealNumber("0.0"));
    121. Assert.assertTrue(NumberValidationUtils.isRealNumber("1"));
    122. Assert.assertTrue(NumberValidationUtils.isRealNumber("+0.14"));
    123. Assert.assertTrue(NumberValidationUtils.isRealNumber("-1"));
    124. Assert.assertTrue(NumberValidationUtils.isRealNumber("0.0"));
    125. Assert.assertFalse(NumberValidationUtils.isRealNumber("00.13"));
    126. Assert.assertFalse(NumberValidationUtils.isRealNumber("ab"));
    127. }
    128. }

发表评论

表情:
评论列表 (有 0 条评论,644人围观)

还没有评论,来说两句吧...

相关阅读