2020import org .checkerframework .checker .nullness .qual .Nullable ;
2121
2222import java .text .DecimalFormat ;
23- import java .text .DecimalFormatSymbols ;
2423import java .text .NumberFormat ;
2524import java .text .ParsePosition ;
2625
2726/**
27+ * Set of tools to overcome {@link NumberFormat} pitfalls.
28+ *
2829 * @author Philippe Charles
2930 */
30- @ lombok .experimental .UtilityClass
3131final class NumberFormats {
3232
33- @ Nullable
34- public Number parseAll (@ NonNull NumberFormat numberFormat , @ NonNull CharSequence input ) {
33+ private NumberFormats () {
34+ throw new UnsupportedOperationException ("This is a utility class and cannot be instantiated" );
35+ }
36+
37+ /**
38+ * Same as {@link NumberFormat#parse(String)} but without throwing an exception.
39+ *
40+ * @param format the format used to parse
41+ * @param input the string to parse
42+ * @return null if parsing failed, a {@link Number} otherwise
43+ */
44+ public static @ Nullable Number parseOrNull (@ NonNull NumberFormat format , @ NonNull CharSequence input ) {
3545 String source = input .toString ();
3646 ParsePosition pos = new ParsePosition (0 );
37- Number result = numberFormat .parse (source , pos );
47+ Number result = format .parse (source , pos );
3848 return pos .getIndex () == input .length () ? result : null ;
3949 }
4050
41- @ NonNull
42- public CharSequence simplify (@ NonNull NumberFormat numberFormat , @ NonNull CharSequence input ) {
43- return NumberFormats .hasGroupingSpaceChar (numberFormat )
44- ? NumberFormats .removeGroupingSpaceChars (input )
51+ public static @ NonNull CharSequence normalize (@ NonNull NumberFormat format , @ NonNull CharSequence input ) {
52+ return format instanceof DecimalFormat
53+ ? normalizeDecimalFormat ((DecimalFormat ) format , input )
4554 : input ;
4655 }
4756
48- private boolean hasGroupingSpaceChar (NumberFormat format ) {
49- return format instanceof DecimalFormat
50- && hasGroupingSpaceChar (((DecimalFormat ) format ).getDecimalFormatSymbols ());
57+ private static CharSequence normalizeDecimalFormat (DecimalFormat format , CharSequence input ) {
58+ char groupingSeparator = getGroupingSeparator (format );
59+ return Character .isSpaceChar (groupingSeparator )
60+ ? removeGroupingSpaceChars (input )
61+ : input ;
5162 }
5263
53- private boolean hasGroupingSpaceChar ( DecimalFormatSymbols symbols ) {
54- return Character . isSpaceChar ( symbols .getGroupingSeparator () );
64+ private static char getGroupingSeparator ( DecimalFormat format ) {
65+ return format . getDecimalFormatSymbols () .getGroupingSeparator ();
5566 }
5667
57- private CharSequence removeGroupingSpaceChars (CharSequence input ) {
68+ private static CharSequence removeGroupingSpaceChars (CharSequence input ) {
5869 if (input .length () < 2 ) {
5970 return input ;
6071 }
@@ -69,9 +80,9 @@ private CharSequence removeGroupingSpaceChars(CharSequence input) {
6980 return result .length () != input .length () ? result .toString () : input ;
7081 }
7182
72- private boolean isGroupingSpaceChar (CharSequence array , int index ) {
73- return Character .isSpaceChar (array .charAt (index ))
74- && Character .isDigit (array .charAt (index - 1 ))
75- && Character .isDigit (array .charAt (index + 1 ));
83+ private static boolean isGroupingSpaceChar (CharSequence input , int index ) {
84+ return Character .isSpaceChar (input .charAt (index ))
85+ && Character .isDigit (input .charAt (index - 1 ))
86+ && Character .isDigit (input .charAt (index + 1 ));
7687 }
7788}
0 commit comments