Detect Numbers in Strings
Updated: Jan 30, 2023
In this example you will see how to detect if a string is a number, along with its precision and scale using the NumberDetector class. This includes allowing you to determine if a number is an integer or real value and detect whether the number is signed or unsigned.
Behind the scenes, DataPipeline uses this feature in its Dataset class to analyze possible numbers and determine the best numeric Java types to hold their values.
You can see other ways to analyze data here.
package com.northconcepts.datapipeline.foundations.examples.number; import com.northconcepts.datapipeline.foundations.number.NumberDescriptor; import com.northconcepts.datapipeline.foundations.number.NumberDetector; import com.northconcepts.datapipeline.foundations.number.NumberMatch; public class DetectNumbersInStrings { public static void main(String[] args) { detectNumber("23"); detectNumber("-236"); detectNumber("23.49"); detectNumber("1234567890"); detectNumber("123456789012345678901234567890"); detectNumber("12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890.123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); detectNumber("23L"); detectNumber("23_3"); detectNumber(" \t\n"); detectNumber(""); detectNumber(null); } public static void detectNumber(String value){ NumberDetector detector = new NumberDetector(); NumberMatch numberMatch = detector.match(value); System.out.println("======================================================================="); System.out.println("String: "+value); if (numberMatch == null) { System.out.println(" ------ NO MATCHING NUMBER ------"); return; } System.out.println(" Source: " + numberMatch.getSource()); System.out.println(" WholePart: " + numberMatch.getWholePart()); System.out.println(" FractionPart: " + numberMatch.getFractionPart()); System.out.println(" Number: " + numberMatch.getNumber()); System.out.println(" Class: " + numberMatch.getNumber().getClass()); NumberDescriptor numberDescriptor = numberMatch.getNumberDescriptor(); if (numberDescriptor != null) { System.out.println(" NumberDescriptor:"); System.out.println(" FieldType: " + numberDescriptor.getFieldType()); System.out.println(" WholeDigits: " + numberDescriptor.getWholeDigits()); System.out.println(" Precision: " + numberDescriptor.getPrecision()); System.out.println(" Scale: " + numberDescriptor.getScale()); System.out.println(" FractionDigits: " + numberDescriptor.getFractionDigits()); System.out.println(" IsNegative: " + numberDescriptor.isNegative()); System.out.println(" IsSigned: " + numberDescriptor.isSigned()); } } }
Code walkthrough
- The
detectNumber()
method will be used to detect if the string is a number and also print additional information about the string. numberMatch.getSource()
returns the input string.getWholePart()
returns the digits to the left of the decimal.getFractionPart()
returns the digits to the right of the decimal.getNumber()
returns the input string parsed into a number.numberMatch.getNumber().getClass()
returns the class of the parsed number.- To get additional information on the number NumberDescriptor is used. It contains details such as FieldType, whole digits, precision, scale and more as shown in this example.
Console Output
======================================================================= String: 23 Source: 23 WholePart: 23 FractionPart: Number: 23 Class: class java.lang.Integer NumberDescriptor: FieldType: INT WholeDigits: 2 Precision: 2 Scale: 0 FractionDigits: 0 IsNegative: false IsSigned: false ======================================================================= String: -236 Source: -236 WholePart: 236 FractionPart: Number: -236 Class: class java.lang.Integer NumberDescriptor: FieldType: INT WholeDigits: 3 Precision: 3 Scale: 0 FractionDigits: 0 IsNegative: true IsSigned: true ======================================================================= String: 23.49 Source: 23.49 WholePart: 23 FractionPart: 49 Number: 23.49 Class: class java.lang.Double NumberDescriptor: FieldType: DOUBLE WholeDigits: 2 Precision: 4 Scale: 2 FractionDigits: 2 IsNegative: false IsSigned: false ======================================================================= String: 1234567890 Source: 1234567890 WholePart: 1234567890 FractionPart: Number: 1234567890 Class: class java.lang.Long NumberDescriptor: FieldType: LONG WholeDigits: 10 Precision: 10 Scale: 0 FractionDigits: 0 IsNegative: false IsSigned: false ======================================================================= String: 123456789012345678901234567890 Source: 123456789012345678901234567890 WholePart: 123456789012345678901234567890 FractionPart: Number: 123456789012345678901234567890 Class: class java.math.BigInteger NumberDescriptor: FieldType: BIG_INTEGER WholeDigits: 30 Precision: 30 Scale: 0 FractionDigits: 0 IsNegative: false IsSigned: false ======================================================================= String: 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890.123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 Source: 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890.123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 WholePart: 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 FractionPart: 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 Number: 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890.123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 Class: class java.math.BigDecimal NumberDescriptor: FieldType: BIG_DECIMAL WholeDigits: 170 Precision: 530 Scale: 360 FractionDigits: 360 IsNegative: false IsSigned: false ======================================================================= String: 23L ------ NO MATCHING NUMBER ------ ======================================================================= String: 23_3 ------ NO MATCHING NUMBER ------ ======================================================================= String: ------ NO MATCHING NUMBER ------ ======================================================================= String: ------ NO MATCHING NUMBER ------ ======================================================================= String: null ------ NO MATCHING NUMBER ------