mirror of https://github.com/alibaba/fastjson2.git
				
				
				
			Fix IOUtils.isNumber() edge cases and add tests
This commit is contained in:
		
							parent
							
								
									9bd0d35872
								
							
						
					
					
						commit
						df9921b8aa
					
				|  | @ -341,10 +341,14 @@ public class IOUtils { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static boolean isNumber(String str) { |     public static boolean isNumber(String str) { | ||||||
|         for (int i = 0; i < str.length(); ++i) { |         int len = str.length(); | ||||||
|  |         if (len == 0) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         for (int i = 0; i < len; ++i) { | ||||||
|             char ch = str.charAt(i); |             char ch = str.charAt(i); | ||||||
|             if (ch == '+' || ch == '-') { |             if (ch == '+' || ch == '-') { | ||||||
|                 if (i != 0) { |                 if (i != 0 || len == 1) { | ||||||
|                     return false; |                     return false; | ||||||
|                 } |                 } | ||||||
|             } else if (ch < '0' || ch > '9') { |             } else if (ch < '0' || ch > '9') { | ||||||
|  | @ -354,11 +358,14 @@ public class IOUtils { | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static boolean isNumber(char[] chars, int off, int len) { |     public static boolean isNumber(char[] buf, int off, int len) { | ||||||
|  |         if (len <= 0) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|         for (int i = off, end = off + len; i < end; ++i) { |         for (int i = off, end = off + len; i < end; ++i) { | ||||||
|             char ch = chars[i]; |             char ch = buf[i]; | ||||||
|             if (ch == '+' || ch == '-') { |             if (ch == '+' || ch == '-') { | ||||||
|                 if (i != 0) { |                 if (i != off || len == 1) { | ||||||
|                     return false; |                     return false; | ||||||
|                 } |                 } | ||||||
|             } else if (ch < '0' || ch > '9') { |             } else if (ch < '0' || ch > '9') { | ||||||
|  | @ -368,11 +375,14 @@ public class IOUtils { | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static boolean isNumber(byte[] chars, int off, int len) { |     public static boolean isNumber(byte[] buf, int off, int len) { | ||||||
|  |         if (len <= 0) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|         for (int i = off, end = off + len; i < end; ++i) { |         for (int i = off, end = off + len; i < end; ++i) { | ||||||
|             char ch = (char) chars[i]; |             char ch = (char) buf[i]; | ||||||
|             if (ch == '+' || ch == '-') { |             if (ch == '+' || ch == '-') { | ||||||
|                 if (i != 0) { |                 if (i != off || len == 1) { | ||||||
|                     return false; |                     return false; | ||||||
|                 } |                 } | ||||||
|             } else if (ch < '0' || ch > '9') { |             } else if (ch < '0' || ch > '9') { | ||||||
|  |  | ||||||
|  | @ -4,7 +4,9 @@ import org.junit.jupiter.api.Test; | ||||||
| 
 | 
 | ||||||
| import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||||
| 
 | 
 | ||||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | import static org.junit.jupiter.api.Assertions.*; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertFalse; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertTrue; | ||||||
| 
 | 
 | ||||||
| public class IOUtilsTest { | public class IOUtilsTest { | ||||||
|     static final byte[] DigitTens = {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', |     static final byte[] DigitTens = {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', | ||||||
|  | @ -319,4 +321,74 @@ public class IOUtilsTest { | ||||||
|             assertEquals(str_n, new String(chars_n)); |             assertEquals(str_n, new String(chars_n)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void testIsNumber() { | ||||||
|  |         // Test String version | ||||||
|  |         assertTrue(IOUtils.isNumber("123")); | ||||||
|  |         assertTrue(IOUtils.isNumber("-123")); | ||||||
|  |         assertTrue(IOUtils.isNumber("+123")); | ||||||
|  |         assertTrue(IOUtils.isNumber("0")); | ||||||
|  |         assertTrue(IOUtils.isNumber("999999999")); | ||||||
|  | 
 | ||||||
|  |         assertFalse(IOUtils.isNumber("12.3")); | ||||||
|  |         assertFalse(IOUtils.isNumber("abc")); | ||||||
|  |         assertFalse(IOUtils.isNumber("")); | ||||||
|  |         assertFalse(IOUtils.isNumber("123a")); | ||||||
|  |         assertFalse(IOUtils.isNumber("++123")); | ||||||
|  |         assertFalse(IOUtils.isNumber("--123")); | ||||||
|  |         assertFalse(IOUtils.isNumber("12+3")); | ||||||
|  |         assertFalse(IOUtils.isNumber("12-3")); | ||||||
|  |         assertFalse(IOUtils.isNumber("-")); | ||||||
|  |         assertFalse(IOUtils.isNumber("+")); | ||||||
|  | 
 | ||||||
|  |         // Test char[] version | ||||||
|  |         char[] chars1 = "123".toCharArray(); | ||||||
|  |         assertTrue(IOUtils.isNumber(chars1, 0, chars1.length)); | ||||||
|  | 
 | ||||||
|  |         char[] chars2 = "-123".toCharArray(); | ||||||
|  |         assertTrue(IOUtils.isNumber(chars2, 0, chars2.length)); | ||||||
|  |         assertFalse(IOUtils.isNumber(chars2, 0, 1)); | ||||||
|  | 
 | ||||||
|  |         char[] chars3 = "+123".toCharArray(); | ||||||
|  |         assertTrue(IOUtils.isNumber(chars3, 0, chars3.length)); | ||||||
|  |         assertFalse(IOUtils.isNumber(chars3, 0, 1)); | ||||||
|  | 
 | ||||||
|  |         char[] chars4 = "12.3".toCharArray(); | ||||||
|  |         assertFalse(IOUtils.isNumber(chars4, 0, chars4.length)); | ||||||
|  | 
 | ||||||
|  |         char[] chars5 = "123a".toCharArray(); | ||||||
|  |         assertFalse(IOUtils.isNumber(chars5, 0, chars5.length)); | ||||||
|  | 
 | ||||||
|  |         char[] chars6 = "12+3".toCharArray(); | ||||||
|  |         assertFalse(IOUtils.isNumber(chars6, 0, chars6.length)); | ||||||
|  | 
 | ||||||
|  |         // Test with offset and length | ||||||
|  |         char[] chars7 = "abc123def".toCharArray(); | ||||||
|  |         assertTrue(IOUtils.isNumber(chars7, 3, 3)); // "123" part | ||||||
|  |         assertFalse(IOUtils.isNumber(chars7, 0, chars7.length)); // entire string | ||||||
|  | 
 | ||||||
|  |         // Test byte[] version | ||||||
|  |         byte[] bytes1 = "123".getBytes(StandardCharsets.UTF_8); | ||||||
|  |         assertTrue(IOUtils.isNumber(bytes1, 0, bytes1.length)); | ||||||
|  | 
 | ||||||
|  |         byte[] bytes2 = "-123".getBytes(StandardCharsets.UTF_8); | ||||||
|  |         assertTrue(IOUtils.isNumber(bytes2, 0, bytes2.length)); | ||||||
|  |         assertFalse(IOUtils.isNumber(bytes2, 0, 1)); | ||||||
|  | 
 | ||||||
|  |         byte[] bytes3 = "+123".getBytes(StandardCharsets.UTF_8); | ||||||
|  |         assertTrue(IOUtils.isNumber(bytes3, 0, bytes3.length)); | ||||||
|  |         assertFalse(IOUtils.isNumber(bytes3, 0, 1)); | ||||||
|  | 
 | ||||||
|  |         byte[] bytes4 = "12.3".getBytes(StandardCharsets.UTF_8); | ||||||
|  |         assertFalse(IOUtils.isNumber(bytes4, 0, bytes4.length)); | ||||||
|  | 
 | ||||||
|  |         byte[] bytes5 = "123a".getBytes(StandardCharsets.UTF_8); | ||||||
|  |         assertFalse(IOUtils.isNumber(bytes5, 0, bytes5.length)); | ||||||
|  | 
 | ||||||
|  |         // Test with offset and length | ||||||
|  |         byte[] bytes6 = "abc123def".getBytes(StandardCharsets.UTF_8); | ||||||
|  |         assertTrue(IOUtils.isNumber(bytes6, 3, 3)); // "123" part | ||||||
|  |         assertFalse(IOUtils.isNumber(bytes6, 0, bytes6.length)); // entire string | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue