View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3.math;
18  
19  import java.lang.reflect.Array;
20  import java.math.BigDecimal;
21  import java.math.BigInteger;
22  import java.math.RoundingMode;
23  import java.util.Objects;
24  
25  import org.apache.commons.lang3.CharUtils;
26  import org.apache.commons.lang3.StringUtils;
27  import org.apache.commons.lang3.Validate;
28  
29  /**
30   * Provides extra functionality for Java Number classes.
31   *
32   * @since 2.0
33   */
34  public class NumberUtils {
35  
36      /** Reusable Long constant for zero. */
37      public static final Long LONG_ZERO = Long.valueOf(0L);
38      /** Reusable Long constant for one. */
39      public static final Long LONG_ONE = Long.valueOf(1L);
40      /** Reusable Long constant for minus one. */
41      public static final Long LONG_MINUS_ONE = Long.valueOf(-1L);
42      /** Reusable Integer constant for zero. */
43      public static final Integer INTEGER_ZERO = Integer.valueOf(0);
44      /** Reusable Integer constant for one. */
45      public static final Integer INTEGER_ONE = Integer.valueOf(1);
46      /** Reusable Integer constant for two */
47      public static final Integer INTEGER_TWO = Integer.valueOf(2);
48      /** Reusable Integer constant for minus one. */
49      public static final Integer INTEGER_MINUS_ONE = Integer.valueOf(-1);
50      /** Reusable Short constant for zero. */
51      public static final Short SHORT_ZERO = Short.valueOf((short) 0);
52      /** Reusable Short constant for one. */
53      public static final Short SHORT_ONE = Short.valueOf((short) 1);
54      /** Reusable Short constant for minus one. */
55      public static final Short SHORT_MINUS_ONE = Short.valueOf((short) -1);
56      /** Reusable Byte constant for zero. */
57      public static final Byte BYTE_ZERO = Byte.valueOf((byte) 0);
58      /** Reusable Byte constant for one. */
59      public static final Byte BYTE_ONE = Byte.valueOf((byte) 1);
60      /** Reusable Byte constant for minus one. */
61      public static final Byte BYTE_MINUS_ONE = Byte.valueOf((byte) -1);
62      /** Reusable Double constant for zero. */
63      public static final Double DOUBLE_ZERO = Double.valueOf(0.0d);
64      /** Reusable Double constant for one. */
65      public static final Double DOUBLE_ONE = Double.valueOf(1.0d);
66      /** Reusable Double constant for minus one. */
67      public static final Double DOUBLE_MINUS_ONE = Double.valueOf(-1.0d);
68      /** Reusable Float constant for zero. */
69      public static final Float FLOAT_ZERO = Float.valueOf(0.0f);
70      /** Reusable Float constant for one. */
71      public static final Float FLOAT_ONE = Float.valueOf(1.0f);
72      /** Reusable Float constant for minus one. */
73      public static final Float FLOAT_MINUS_ONE = Float.valueOf(-1.0f);
74  
75      /**
76       * {@link Integer#MAX_VALUE} as a {@link Long}.
77       *
78       * @since 3.12.0
79       */
80      public static final Long LONG_INT_MAX_VALUE = Long.valueOf(Integer.MAX_VALUE);
81  
82      /**
83       * {@link Integer#MIN_VALUE} as a {@link Long}.
84       *
85       * @since 3.12.0
86       */
87      public static final Long LONG_INT_MIN_VALUE = Long.valueOf(Integer.MIN_VALUE);
88  
89      /**
90       * Compares two {@code byte} values numerically. This is the same functionality as provided in Java 7.
91       *
92       * @param x the first {@code byte} to compare.
93       * @param y the second {@code byte} to compare.
94       * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if {@code x < y}; and a value greater than {@code 0} if {@code x > y}.
95       * @since 3.4
96       * @deprecated Use {@link Byte#compare(byte, byte)}.
97       */
98      @Deprecated
99      public static int compare(final byte x, final byte y) {
100         return Byte.compare(x, y);
101     }
102 
103     /**
104      * Compares two {@code int} values numerically. This is the same functionality as provided in Java 7.
105      *
106      * @param x the first {@code int} to compare.
107      * @param y the second {@code int} to compare.
108      * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if {@code x < y}; and a value greater than {@code 0} if {@code x > y}.
109      * @since 3.4
110      * @deprecated Use {@link Integer#compare(int, int)}.
111      */
112     @Deprecated
113     public static int compare(final int x, final int y) {
114         return Integer.compare(x, y);
115     }
116 
117     /**
118      * Compares to {@code long} values numerically. This is the same functionality as provided in Java 7.
119      *
120      * @param x the first {@code long} to compare.
121      * @param y the second {@code long} to compare.
122      * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if {@code x < y}; and a value greater than {@code 0} if {@code x > y}.
123      * @since 3.4
124      * @deprecated Use {@link Long#compare(long, long)}.
125      */
126     @Deprecated
127     public static int compare(final long x, final long y) {
128         return Long.compare(x, y);
129     }
130 
131     /**
132      * Compares to {@code short} values numerically. This is the same functionality as provided in Java 7.
133      *
134      * @param x the first {@code short} to compare.
135      * @param y the second {@code short} to compare.
136      * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if {@code x < y}; and a value greater than {@code 0} if {@code x > y}.
137      * @since 3.4
138      * @deprecated Use {@link Short#compare(short, short)}.
139      */
140     @Deprecated
141     public static int compare(final short x, final short y) {
142         return Short.compare(x, y);
143     }
144 
145     /**
146      * Creates a {@link BigDecimal} from a {@link String}.
147      *
148      * <p>
149      * Returns {@code null} if the string is {@code null}.
150      * </p>
151      *
152      * @param str a {@link String} to convert, may be null.
153      * @return converted {@link BigDecimal} (or null if the input is null).
154      * @throws NumberFormatException if the value cannot be converted.
155      */
156     public static BigDecimal createBigDecimal(final String str) {
157         if (str == null) {
158             return null;
159         }
160         // handle JDK1.3.1 bug where "" throws IndexOutOfBoundsException
161         if (StringUtils.isBlank(str)) {
162             throw new NumberFormatException("A blank string is not a valid number");
163         }
164         return new BigDecimal(str);
165     }
166 
167     /**
168      * Creates a {@link BigInteger} from a {@link String}.
169      *
170      * Handles hexadecimal (0x or #) and octal (0) notations.
171      *
172      * <p>
173      * Returns {@code null} if the string is {@code null}.
174      * </p>
175      *
176      * @param str a {@link String} to convert, may be null.
177      * @return converted {@link BigInteger} (or null if the input is null).
178      * @throws NumberFormatException if the value cannot be converted.
179      * @since 3.2
180      */
181     public static BigInteger createBigInteger(final String str) {
182         if (str == null) {
183             return null;
184         }
185         if (str.isEmpty()) {
186             throw new NumberFormatException("An empty string is not a valid number");
187         }
188         int pos = 0; // offset within string
189         int radix = 10;
190         boolean negate = false; // need to negate later?
191         final char char0 = str.charAt(0);
192         if (char0 == '-') {
193             negate = true;
194             pos = 1;
195         } else if (char0 == '+') {
196             pos = 1;
197         }
198         if (str.startsWith("0x", pos) || str.startsWith("0X", pos)) { // hex
199             radix = 16;
200             pos += 2;
201         } else if (str.startsWith("#", pos)) { // alternative hex (allowed by Long/Integer)
202             radix = 16;
203             pos++;
204         } else if (str.startsWith("0", pos) && str.length() > pos + 1) { // octal; so long as there are additional digits
205             radix = 8;
206             pos++;
207         } // default is to treat as decimal
208         final BigInteger value = new BigInteger(str.substring(pos), radix);
209         return negate ? value.negate() : value;
210     }
211 
212     /**
213      * Creates a {@link Double} from a {@link String}.
214      *
215      * <p>
216      * Returns {@code null} if the string is {@code null}.
217      * </p>
218      *
219      * @param str a {@link String} to convert, may be null.
220      * @return converted {@link Double} (or null if the input is null).
221      * @throws NumberFormatException if the value cannot be converted.
222      */
223     public static Double createDouble(final String str) {
224         if (str == null) {
225             return null;
226         }
227         return Double.valueOf(str);
228     }
229 
230     /**
231      * Creates a {@link Float} from a {@link String}.
232      *
233      * <p>
234      * Returns {@code null} if the string is {@code null}.
235      * </p>
236      *
237      * @param str a {@link String} to convert, may be null.
238      * @return converted {@link Float} (or null if the input is null).
239      * @throws NumberFormatException if the value cannot be converted.
240      */
241     public static Float createFloat(final String str) {
242         if (str == null) {
243             return null;
244         }
245         return Float.valueOf(str);
246     }
247 
248     /**
249      * Creates an {@link Integer} from a {@link String}.
250      *
251      * Handles hexadecimal (0xhhhh) and octal (0dddd) notations. A leading zero means octal; spaces are not trimmed.
252      *
253      * <p>
254      * Returns {@code null} if the string is {@code null}.
255      * </p>
256      *
257      * @param str a {@link String} to convert, may be null.
258      * @return converted {@link Integer} (or null if the input is null).
259      * @throws NumberFormatException if the value cannot be converted.
260      */
261     public static Integer createInteger(final String str) {
262         if (str == null) {
263             return null;
264         }
265         // decode() handles 0xAABD and 0777 (hex and octal) as well.
266         return Integer.decode(str);
267     }
268 
269     /**
270      * Creates a {@link Long} from a {@link String}.
271      *
272      * Handles hexadecimal (0Xhhhh) and octal (0ddd) notations. A leading zero means octal; spaces are not trimmed.
273      *
274      * <p>
275      * Returns {@code null} if the string is {@code null}.
276      * </p>
277      *
278      * @param str a {@link String} to convert, may be null.
279      * @return converted {@link Long} (or null if the input is null).
280      * @throws NumberFormatException if the value cannot be converted.
281      * @since 3.1
282      */
283     public static Long createLong(final String str) {
284         if (str == null) {
285             return null;
286         }
287         return Long.decode(str);
288     }
289 
290     /**
291      * Creates a {@link Number} from a {@link String}.
292      *
293      * <p>
294      * If the string starts with {@code 0x} or {@code -0x} (lower or upper case) or {@code #} or {@code -#}, it will be interpreted as a hexadecimal Integer -
295      * or Long, if the number of digits after the prefix is more than 8 - or BigInteger if there are more than 16 digits.
296      * </p>
297      * <p>
298      * Then, the value is examined for a type qualifier on the end, i.e. one of {@code 'f', 'F', 'd', 'D', 'l', 'L'}. If it is found, it starts trying to create
299      * successively larger types from the type specified until one is found that can represent the value.
300      * </p>
301      *
302      * <p>
303      * If a type specifier is not found, it will check for a decimal point and then try successively larger types from {@link Integer} to {@link BigInteger} and
304      * from {@link Float} to {@link BigDecimal}.
305      * </p>
306      *
307      * <p>
308      * Integral values with a leading {@code 0} will be interpreted as octal; the returned number will be Integer, Long or BigDecimal as appropriate.
309      * </p>
310      *
311      * <p>
312      * Returns {@code null} if the string is {@code null}.
313      * </p>
314      *
315      * <p>
316      * This method does not trim the input string, i.e., strings with leading or trailing spaces will generate NumberFormatExceptions.
317      * </p>
318      *
319      * @param str String containing a number, may be null.
320      * @return Number created from the string (or null if the input is null).
321      * @throws NumberFormatException if the value cannot be converted.
322      */
323     public static Number createNumber(final String str) {
324         if (str == null) {
325             return null;
326         }
327         if (StringUtils.isBlank(str)) {
328             throw new NumberFormatException("A blank string is not a valid number");
329         }
330         // Need to deal with all possible hex prefixes here
331         final String[] hexPrefixes = { "0x", "0X", "#" };
332         final int length = str.length();
333         final int offset = isSign(str.charAt(0)) ? 1 : 0;
334         int pfxLen = 0;
335         for (final String pfx : hexPrefixes) {
336             if (str.startsWith(pfx, offset)) {
337                 pfxLen += pfx.length() + offset;
338                 break;
339             }
340         }
341         if (pfxLen > 0) { // we have a hex number
342             char firstSigDigit = 0; // strip leading zeroes
343             for (int i = pfxLen; i < length; i++) {
344                 firstSigDigit = str.charAt(i);
345                 if (firstSigDigit != '0') {
346                     break;
347                 }
348                 pfxLen++;
349             }
350             final int hexDigits = length - pfxLen;
351             if (hexDigits > 16 || hexDigits == 16 && firstSigDigit > '7') { // too many for Long
352                 return createBigInteger(str);
353             }
354             if (hexDigits > 8 || hexDigits == 8 && firstSigDigit > '7') { // too many for an int
355                 return createLong(str);
356             }
357             return createInteger(str);
358         }
359         final char lastChar = str.charAt(length - 1);
360         final String mant;
361         final String dec;
362         final String exp;
363         final int decPos = str.indexOf('.');
364         final int expPos = str.indexOf('e') + str.indexOf('E') + 1; // assumes both not present
365         // if both e and E are present, this is caught by the checks on expPos (which prevent IOOBE)
366         // and the parsing which will detect if e or E appear in a number due to using the wrong offset
367         // Detect if the return type has been requested
368         final boolean requestType = !Character.isDigit(lastChar) && lastChar != '.';
369         if (decPos > -1) { // there is a decimal point
370             if (expPos > -1) { // there is an exponent
371                 if (expPos <= decPos || expPos > length) { // prevents double exponent causing IOOBE
372                     throw new NumberFormatException(str + " is not a valid number.");
373                 }
374                 dec = str.substring(decPos + 1, expPos);
375             } else {
376                 // No exponent, but there may be a type character to remove
377                 dec = str.substring(decPos + 1, requestType ? length - 1 : length);
378             }
379             mant = getMantissa(str, decPos);
380         } else {
381             if (expPos > -1) {
382                 if (expPos > length) { // prevents double exponent causing IOOBE
383                     throw new NumberFormatException(str + " is not a valid number.");
384                 }
385                 mant = getMantissa(str, expPos);
386             } else {
387                 // No decimal, no exponent, but there may be a type character to remove
388                 mant = getMantissa(str, requestType ? length - 1 : length);
389             }
390             dec = null;
391         }
392         if (requestType) {
393             if (expPos > -1 && expPos < length - 1) {
394                 exp = str.substring(expPos + 1, length - 1);
395             } else {
396                 exp = null;
397             }
398             // Requesting a specific type.
399             final String numeric = str.substring(0, length - 1);
400             switch (lastChar) {
401             case 'l':
402             case 'L':
403                 if (dec == null && exp == null && (!numeric.isEmpty() && numeric.charAt(0) == '-' && isDigits(numeric.substring(1)) || isDigits(numeric))) {
404                     try {
405                         return createLong(numeric);
406                     } catch (final NumberFormatException ignored) {
407                         // Too big for a long
408                     }
409                     return createBigInteger(numeric);
410                 }
411                 throw new NumberFormatException(str + " is not a valid number.");
412             case 'f':
413             case 'F':
414                 try {
415                     final Float f = createFloat(str);
416                     if (!(f.isInfinite() || f.floatValue() == 0.0F && !isZero(mant, dec))) {
417                         // If it's too big for a float or the float value = 0 and the string
418                         // has non-zeros in it, then float does not have the precision we want
419                         return f;
420                     }
421                 } catch (final NumberFormatException ignored) {
422                     // ignore the bad number
423                 }
424                 // falls-through
425             case 'd':
426             case 'D':
427                 try {
428                     final Double d = createDouble(str);
429                     if (!(d.isInfinite() || d.doubleValue() == 0.0D && !isZero(mant, dec))) {
430                         return d;
431                     }
432                 } catch (final NumberFormatException ignored) {
433                     // ignore the bad number
434                 }
435                 try {
436                     return createBigDecimal(numeric);
437                 } catch (final NumberFormatException ignored) {
438                     // ignore the bad number
439                 }
440                 // falls-through
441             default:
442                 throw new NumberFormatException(str + " is not a valid number.");
443             }
444         }
445         // User doesn't have a preference on the return type, so let's start
446         // small and go from there...
447         if (expPos > -1 && expPos < length - 1) {
448             exp = str.substring(expPos + 1);
449         } else {
450             exp = null;
451         }
452         if (dec == null && exp == null) { // no decimal point and no exponent
453             // Must be an Integer, Long, Biginteger
454             try {
455                 return createInteger(str);
456             } catch (final NumberFormatException ignored) {
457                 // ignore the bad number
458             }
459             try {
460                 return createLong(str);
461             } catch (final NumberFormatException ignored) {
462                 // ignore the bad number
463             }
464             return createBigInteger(str);
465         }
466         // Must be a Float, Double, BigDecimal
467         try {
468             final Float f = createFloat(str);
469             final Double d = createDouble(str);
470             if (!f.isInfinite() && !(f.floatValue() == 0.0F && !isZero(mant, dec)) && f.toString().equals(d.toString())) {
471                 return f;
472             }
473             if (!d.isInfinite() && !(d.doubleValue() == 0.0D && !isZero(mant, dec))) {
474                 final BigDecimal b = createBigDecimal(str);
475                 if (b.compareTo(BigDecimal.valueOf(d.doubleValue())) == 0) {
476                     return d;
477                 }
478                 return b;
479             }
480         } catch (final NumberFormatException ignored) {
481             // ignore the bad number
482         }
483         return createBigDecimal(str);
484     }
485 
486     /**
487      * Utility method for {@link #createNumber(String)}.
488      *
489      * <p>
490      * Returns mantissa of the given number.
491      * </p>
492      *
493      * @param str     the string representation of the number.
494      * @param stopPos the position of the exponent or decimal point.
495      * @return mantissa of the given number.
496      * @throws NumberFormatException if no mantissa can be retrieved.
497      */
498     private static String getMantissa(final String str, final int stopPos) {
499         final char firstChar = str.charAt(0);
500         final boolean hasSign = isSign(firstChar);
501         final int length = str.length();
502         if (length <= (hasSign ? 1 : 0) || length < stopPos) {
503             throw new NumberFormatException(str + " is not a valid number.");
504         }
505         return hasSign ? str.substring(1, stopPos) : str.substring(0, stopPos);
506     }
507 
508     /**
509      * Utility method for {@link #createNumber(java.lang.String)}.
510      *
511      * <p>
512      * Returns {@code true} if s is {@code null} or empty.
513      * </p>
514      *
515      * @param str the String to check.
516      * @return if it is all zeros or {@code null}.
517      */
518     private static boolean isAllZeros(final String str) {
519         if (str == null) {
520             return true;
521         }
522         for (int i = str.length() - 1; i >= 0; i--) {
523             if (str.charAt(i) != '0') {
524                 return false;
525             }
526         }
527         return true;
528     }
529 
530     /**
531      * Checks whether the String is a valid Java number.
532      *
533      * <p>
534      * Valid numbers include hexadecimal marked with the {@code 0x} or {@code 0X} qualifier, octal numbers, scientific notation and numbers marked with a type
535      * qualifier (e.g. 123L).
536      * </p>
537      *
538      * <p>
539      * Non-hexadecimal strings beginning with a leading zero are treated as octal values. Thus the string {@code 09} will return {@code false}, since {@code 9}
540      * is not a valid octal value. However, numbers beginning with {@code 0.} are treated as decimal.
541      * </p>
542      *
543      * <p>
544      * {@code null} and empty/blank {@link String} will return {@code false}.
545      * </p>
546      *
547      * <p>
548      * Note, {@link #createNumber(String)} should return a number for every input resulting in {@code true}.
549      * </p>
550      *
551      * @param str the {@link String} to check.
552      * @return {@code true} if the string is a correctly formatted number.
553      * @since 3.5
554      */
555     public static boolean isCreatable(final String str) {
556         if (StringUtils.isEmpty(str)) {
557             return false;
558         }
559         final char[] chars = str.toCharArray();
560         int sz = chars.length;
561         boolean hasExp = false;
562         boolean hasDecPoint = false;
563         boolean allowSigns = false;
564         boolean foundDigit = false;
565         // deal with any possible sign up front
566         final int start = isSign(chars[0]) ? 1 : 0;
567         if (sz > start + 1 && chars[start] == '0' && !StringUtils.contains(str, '.')) { // leading 0, skip if is a decimal number
568             if (chars[start + 1] == 'x' || chars[start + 1] == 'X') { // leading 0x/0X
569                 int i = start + 2;
570                 if (i == sz) {
571                     return false; // str == "0x"
572                 }
573                 // checking hex (it can't be anything else)
574                 for (; i < chars.length; i++) {
575                     if (!CharUtils.isHex(chars[i])) {
576                         return false;
577                     }
578                 }
579                 return true;
580             }
581             if (Character.isDigit(chars[start + 1])) {
582                 // leading 0, but not hex, must be octal
583                 int i = start + 1;
584                 for (; i < chars.length; i++) {
585                     if (!CharUtils.isOctal(chars[i])) {
586                         return false;
587                     }
588                 }
589                 return true;
590             }
591         }
592         sz--; // don't want to loop to the last char, check it afterwards
593               // for type qualifiers
594         int i = start;
595         // loop to the next to last char or to the last char if we need another digit to
596         // make a valid number (e.g. chars[0..5] = "1234E")
597         while (i < sz || i < sz + 1 && allowSigns && !foundDigit) {
598             if (CharUtils.isAsciiNumeric(chars[i])) {
599                 foundDigit = true;
600                 allowSigns = false;
601             } else if (chars[i] == '.') {
602                 if (hasDecPoint || hasExp) {
603                     // two decimal points or dec in exponent
604                     return false;
605                 }
606                 hasDecPoint = true;
607             } else if (chars[i] == 'e' || chars[i] == 'E') {
608                 // we've already taken care of hex.
609                 if (hasExp) {
610                     // two E's
611                     return false;
612                 }
613                 if (!foundDigit) {
614                     return false;
615                 }
616                 hasExp = true;
617                 allowSigns = true;
618             } else if (isSign(chars[i])) {
619                 if (!allowSigns) {
620                     return false;
621                 }
622                 allowSigns = false;
623                 foundDigit = false; // we need a digit after the E
624             } else {
625                 return false;
626             }
627             i++;
628         }
629         if (i < chars.length) {
630             if (CharUtils.isAsciiNumeric(chars[i])) {
631                 // no type qualifier, OK
632                 return true;
633             }
634             if (chars[i] == 'e' || chars[i] == 'E') {
635                 // can't have an E at the last byte
636                 return false;
637             }
638             if (chars[i] == '.') {
639                 if (hasDecPoint || hasExp) {
640                     // two decimal points or dec in exponent
641                     return false;
642                 }
643                 // single trailing decimal point after non-exponent is ok
644                 return foundDigit;
645             }
646             if (!allowSigns && (chars[i] == 'd' || chars[i] == 'D' || chars[i] == 'f' || chars[i] == 'F')) {
647                 return foundDigit;
648             }
649             if (chars[i] == 'l' || chars[i] == 'L') {
650                 // not allowing L with an exponent or decimal point
651                 return foundDigit && !hasExp && !hasDecPoint;
652             }
653             // last character is illegal
654             return false;
655         }
656         // allowSigns is true iff the val ends in 'E'
657         // found digit it to make sure weird stuff like '.' and '1E-' doesn't pass
658         return !allowSigns && foundDigit;
659     }
660 
661     /**
662      * Checks whether the {@link String} contains only digit characters.
663      *
664      * <p>
665      * {@code null} and empty String will return {@code false}.
666      * </p>
667      *
668      * @param str the {@link String} to check
669      * @return {@code true} if str contains only Unicode numeric
670      */
671     public static boolean isDigits(final String str) {
672         return StringUtils.isNumeric(str);
673     }
674 
675     /**
676      * Checks whether the String is a valid Java number.
677      *
678      * <p>
679      * Valid numbers include hexadecimal marked with the {@code 0x} or {@code 0X} qualifier, octal numbers, scientific notation and numbers marked with a type
680      * qualifier (e.g. 123L).
681      * </p>
682      *
683      * <p>
684      * Non-hexadecimal strings beginning with a leading zero are treated as octal values. Thus the string {@code 09} will return {@code false}, since {@code 9}
685      * is not a valid octal value. However, numbers beginning with {@code 0.} are treated as decimal.
686      * </p>
687      *
688      * <p>
689      * {@code null} and empty/blank {@link String} will return {@code false}.
690      * </p>
691      *
692      * <p>
693      * Note, {@link #createNumber(String)} should return a number for every input resulting in {@code true}.
694      * </p>
695      *
696      * @param str the {@link String} to check.
697      * @return {@code true} if the string is a correctly formatted number.
698      * @since 3.3 the code supports hexadecimal {@code 0Xhhh} an octal {@code 0ddd} validation.
699      * @deprecated This feature will be removed in Lang 4, use {@link NumberUtils#isCreatable(String)} instead.
700      */
701     @Deprecated
702     public static boolean isNumber(final String str) {
703         return isCreatable(str);
704     }
705 
706     /**
707      * Checks whether the given String is a parsable number.
708      *
709      * <p>
710      * Parsable numbers include those Strings understood by {@link Integer#parseInt(String)}, {@link Long#parseLong(String)}, {@link Float#parseFloat(String)}
711      * or {@link Double#parseDouble(String)}. This method can be used instead of catching {@link java.text.ParseException} when calling one of those methods.
712      * </p>
713      *
714      * <p>
715      * Hexadecimal and scientific notations are <strong>not</strong> considered parsable. See {@link #isCreatable(String)} on those cases.
716      * </p>
717      *
718      * <p>
719      * {@code null} and empty String will return {@code false}.
720      * </p>
721      *
722      * @param str the String to check.
723      * @return {@code true} if the string is a parsable number.
724      * @since 3.4
725      */
726     public static boolean isParsable(final String str) {
727         if (StringUtils.isEmpty(str)) {
728             return false;
729         }
730         if (str.charAt(str.length() - 1) == '.') {
731             return false;
732         }
733         if (str.charAt(0) == '-') {
734             if (str.length() == 1) {
735                 return false;
736             }
737             return withDecimalsParsing(str, 1);
738         }
739         return withDecimalsParsing(str, 0);
740     }
741 
742     private static boolean isSign(final char ch) {
743         return ch == '-' || ch == '+';
744     }
745 
746     /**
747      * Utility method for {@link #createNumber(java.lang.String)}.
748      *
749      * <p>
750      * This will check if the magnitude of the number is zero by checking if there are only zeros before and after the decimal place.
751      * </p>
752      *
753      * <p>
754      * Note: It is <strong>assumed</strong> that the input string has been converted to either a Float or Double with a value of zero when this method is
755      * called. This eliminates invalid input for example {@code ".", ".D", ".e0"}.
756      * </p>
757      *
758      * <p>
759      * Thus the method only requires checking if both arguments are null, empty or contain only zeros.
760      * </p>
761      *
762      * <p>
763      * Given {@code s = mant + "." + dec}:
764      * </p>
765      * <ul>
766      * <li>{@code true} if s is {@code "0.0"}
767      * <li>{@code true} if s is {@code "0."}
768      * <li>{@code true} if s is {@code ".0"}
769      * <li>{@code false} otherwise (this assumes {@code "."} is not possible)
770      * </ul>
771      *
772      * @param mant the mantissa decimal digits before the decimal point (sign must be removed; never null).
773      * @param dec  the decimal digits after the decimal point (exponent and type specifier removed; can be null)
774      * @return true if the magnitude is zero.
775      */
776     private static boolean isZero(final String mant, final String dec) {
777         return isAllZeros(mant) && isAllZeros(dec);
778     }
779 
780     /**
781      * Returns the maximum value in an array.
782      *
783      * @param array an array, must not be null or empty.
784      * @return the maximum value in the array.
785      * @throws NullPointerException     if {@code array} is {@code null}.
786      * @throws IllegalArgumentException if {@code array} is empty.
787      * @since 3.4 Changed signature from max(byte[]) to max(byte...).
788      */
789     public static byte max(final byte... array) {
790         // Validates input
791         validateArray(array);
792         // Finds and returns max
793         byte max = array[0];
794         for (int i = 1; i < array.length; i++) {
795             if (array[i] > max) {
796                 max = array[i];
797             }
798         }
799         return max;
800     }
801 
802     /**
803      * Gets the maximum of three {@code byte} values.
804      *
805      * @param a value 1.
806      * @param b value 2.
807      * @param c value 3.
808      * @return the largest of the values.
809      */
810     public static byte max(byte a, final byte b, final byte c) {
811         if (b > a) {
812             a = b;
813         }
814         if (c > a) {
815             a = c;
816         }
817         return a;
818     }
819 
820     /**
821      * Returns the maximum value in an array.
822      *
823      * @param array an array, must not be null or empty.
824      * @return the maximum value in the array.
825      * @throws NullPointerException     if {@code array} is {@code null}.
826      * @throws IllegalArgumentException if {@code array} is empty.
827      * @see IEEE754rUtils#max(double[]) IEEE754rUtils for a version of this method that handles NaN differently.
828      * @since 3.4 Changed signature from max(double[]) to max(double...)
829      */
830     public static double max(final double... array) {
831         // Validates input
832         validateArray(array);
833         // Finds and returns max
834         double max = array[0];
835         for (int j = 1; j < array.length; j++) {
836             if (Double.isNaN(array[j])) {
837                 return Double.NaN;
838             }
839             if (array[j] > max) {
840                 max = array[j];
841             }
842         }
843         return max;
844     }
845 
846     /**
847      * Gets the maximum of three {@code double} values.
848      *
849      * <p>
850      * If any value is {@code NaN}, {@code NaN} is returned. Infinity is handled.
851      * </p>
852      *
853      * @param a value 1.
854      * @param b value 2.
855      * @param c value 3.
856      * @return the largest of the values.
857      * @see IEEE754rUtils#max(double, double, double) for a version of this method that handles NaN differently.
858      */
859     public static double max(final double a, final double b, final double c) {
860         return Math.max(Math.max(a, b), c);
861     }
862 
863     /**
864      * Returns the maximum value in an array.
865      *
866      * @param array an array, must not be null or empty.
867      * @return the maximum value in the array.
868      * @throws NullPointerException     if {@code array} is {@code null}.
869      * @throws IllegalArgumentException if {@code array} is empty.
870      * @see IEEE754rUtils#max(float[]) IEEE754rUtils for a version of this method that handles NaN differently.
871      * @since 3.4 Changed signature from max(float[]) to max(float...).
872      */
873     public static float max(final float... array) {
874         // Validates input
875         validateArray(array);
876         // Finds and returns max
877         float max = array[0];
878         for (int j = 1; j < array.length; j++) {
879             if (Float.isNaN(array[j])) {
880                 return Float.NaN;
881             }
882             if (array[j] > max) {
883                 max = array[j];
884             }
885         }
886         return max;
887     }
888     // must handle Long, Float, Integer, Float, Short,
889     // BigDecimal, BigInteger and Byte
890     // useful methods:
891     // Byte.decode(String)
892     // Byte.valueOf(String, int radix)
893     // Byte.valueOf(String)
894     // Double.valueOf(String)
895     // Float.valueOf(String)
896     // Float.valueOf(String)
897     // Integer.valueOf(String, int radix)
898     // Integer.valueOf(String)
899     // Integer.decode(String)
900     // Integer.getInteger(String)
901     // Integer.getInteger(String, int val)
902     // Integer.getInteger(String, Integer val)
903     // Integer.valueOf(String)
904     // Double.valueOf(String)
905     // new Byte(String)
906     // Long.valueOf(String)
907     // Long.getLong(String)
908     // Long.getLong(String, int)
909     // Long.getLong(String, Integer)
910     // Long.valueOf(String, int)
911     // Long.valueOf(String)
912     // Short.valueOf(String)
913     // Short.decode(String)
914     // Short.valueOf(String, int)
915     // Short.valueOf(String)
916     // new BigDecimal(String)
917     // new BigInteger(String)
918     // new BigInteger(String, int radix)
919     // Possible inputs:
920     // 45 45.5 45E7 4.5E7 Hex Oct Binary xxxF xxxD xxxf xxxd
921     // plus minus everything. Prolly more. A lot are not separable.
922 
923     /**
924      * Gets the maximum of three {@code float} values.
925      *
926      * <p>
927      * If any value is {@code NaN}, {@code NaN} is returned. Infinity is handled.
928      * </p>
929      *
930      * @param a value 1.
931      * @param b value 2.
932      * @param c value 3.
933      * @return the largest of the values.
934      * @see IEEE754rUtils#max(float, float, float) for a version of this method that handles NaN differently.
935      */
936     public static float max(final float a, final float b, final float c) {
937         return Math.max(Math.max(a, b), c);
938     }
939 
940     /**
941      * Returns the maximum value in an array.
942      *
943      * @param array an array, must not be null or empty.
944      * @return the maximum value in the array.
945      * @throws NullPointerException     if {@code array} is {@code null}.
946      * @throws IllegalArgumentException if {@code array} is empty.
947      * @since 3.4 Changed signature from max(int[]) to max(int...).
948      */
949     public static int max(final int... array) {
950         // Validates input
951         validateArray(array);
952         // Finds and returns max
953         int max = array[0];
954         for (int j = 1; j < array.length; j++) {
955             if (array[j] > max) {
956                 max = array[j];
957             }
958         }
959         return max;
960     }
961 
962     /**
963      * Gets the maximum of three {@code int} values.
964      *
965      * @param a value 1.
966      * @param b value 2.
967      * @param c value 3.
968      * @return the largest of the values.
969      */
970     public static int max(int a, final int b, final int c) {
971         if (b > a) {
972             a = b;
973         }
974         if (c > a) {
975             a = c;
976         }
977         return a;
978     }
979 
980     /**
981      * Returns the maximum value in an array.
982      *
983      * @param array an array, must not be null or empty.
984      * @return the maximum value in the array.
985      * @throws NullPointerException     if {@code array} is {@code null}.
986      * @throws IllegalArgumentException if {@code array} is empty.
987      * @since 3.4 Changed signature from max(long[]) to max(long...).
988      */
989     public static long max(final long... array) {
990         // Validates input
991         validateArray(array);
992         // Finds and returns max
993         long max = array[0];
994         for (int j = 1; j < array.length; j++) {
995             if (array[j] > max) {
996                 max = array[j];
997             }
998         }
999         return max;
1000     }
1001 
1002     // 3 param max
1003     /**
1004      * Gets the maximum of three {@code long} values.
1005      *
1006      * @param a value 1.
1007      * @param b value 2.
1008      * @param c value 3.
1009      * @return the largest of the values.
1010      */
1011     public static long max(long a, final long b, final long c) {
1012         if (b > a) {
1013             a = b;
1014         }
1015         if (c > a) {
1016             a = c;
1017         }
1018         return a;
1019     }
1020 
1021     /**
1022      * Returns the maximum value in an array.
1023      *
1024      * @param array an array, must not be null or empty.
1025      * @return the maximum value in the array.
1026      * @throws NullPointerException     if {@code array} is {@code null}.
1027      * @throws IllegalArgumentException if {@code array} is empty.
1028      * @since 3.4 Changed signature from max(short[]) to max(short...).
1029      */
1030     public static short max(final short... array) {
1031         // Validates input
1032         validateArray(array);
1033         // Finds and returns max
1034         short max = array[0];
1035         for (int i = 1; i < array.length; i++) {
1036             if (array[i] > max) {
1037                 max = array[i];
1038             }
1039         }
1040         return max;
1041     }
1042 
1043     /**
1044      * Gets the maximum of three {@code short} values.
1045      *
1046      * @param a value 1.
1047      * @param b value 2.
1048      * @param c value 3.
1049      * @return the largest of the values.
1050      */
1051     public static short max(short a, final short b, final short c) {
1052         if (b > a) {
1053             a = b;
1054         }
1055         if (c > a) {
1056             a = c;
1057         }
1058         return a;
1059     }
1060 
1061     /**
1062      * Returns the minimum value in an array.
1063      *
1064      * @param array an array, must not be null or empty.
1065      * @return the minimum value in the array.
1066      * @throws NullPointerException     if {@code array} is {@code null}.
1067      * @throws IllegalArgumentException if {@code array} is empty.
1068      * @since 3.4 Changed signature from min(byte[]) to min(byte...).
1069      */
1070     public static byte min(final byte... array) {
1071         // Validates input
1072         validateArray(array);
1073         // Finds and returns min
1074         byte min = array[0];
1075         for (int i = 1; i < array.length; i++) {
1076             if (array[i] < min) {
1077                 min = array[i];
1078             }
1079         }
1080         return min;
1081     }
1082 
1083     /**
1084      * Gets the minimum of three {@code byte} values.
1085      *
1086      * @param a value 1.
1087      * @param b value 2.
1088      * @param c value 3.
1089      * @return the smallest of the values.
1090      */
1091     public static byte min(byte a, final byte b, final byte c) {
1092         if (b < a) {
1093             a = b;
1094         }
1095         if (c < a) {
1096             a = c;
1097         }
1098         return a;
1099     }
1100 
1101     /**
1102      * Returns the minimum value in an array.
1103      *
1104      * @param array an array, must not be null or empty.
1105      * @return the minimum value in the array.
1106      * @throws NullPointerException     if {@code array} is {@code null}.
1107      * @throws IllegalArgumentException if {@code array} is empty.
1108      * @see IEEE754rUtils#min(double[]) IEEE754rUtils for a version of this method that handles NaN differently.
1109      * @since 3.4 Changed signature from min(double[]) to min(double...).
1110      */
1111     public static double min(final double... array) {
1112         // Validates input
1113         validateArray(array);
1114         // Finds and returns min
1115         double min = array[0];
1116         for (int i = 1; i < array.length; i++) {
1117             if (Double.isNaN(array[i])) {
1118                 return Double.NaN;
1119             }
1120             if (array[i] < min) {
1121                 min = array[i];
1122             }
1123         }
1124         return min;
1125     }
1126 
1127     /**
1128      * Gets the minimum of three {@code double} values.
1129      *
1130      * <p>
1131      * If any value is {@code NaN}, {@code NaN} is returned. Infinity is handled.
1132      * </p>
1133      *
1134      * @param a value 1.
1135      * @param b value 2.
1136      * @param c value 3.
1137      * @return the smallest of the values.
1138      * @see IEEE754rUtils#min(double, double, double) for a version of this method that handles NaN differently.
1139      */
1140     public static double min(final double a, final double b, final double c) {
1141         return Math.min(Math.min(a, b), c);
1142     }
1143 
1144     /**
1145      * Returns the minimum value in an array.
1146      *
1147      * @param array an array, must not be null or empty.
1148      * @return the minimum value in the array.
1149      * @throws NullPointerException     if {@code array} is {@code null}.
1150      * @throws IllegalArgumentException if {@code array} is empty.
1151      * @see IEEE754rUtils#min(float[]) IEEE754rUtils for a version of this method that handles NaN differently.
1152      * @since 3.4 Changed signature from min(float[]) to min(float...).
1153      */
1154     public static float min(final float... array) {
1155         // Validates input
1156         validateArray(array);
1157         // Finds and returns min
1158         float min = array[0];
1159         for (int i = 1; i < array.length; i++) {
1160             if (Float.isNaN(array[i])) {
1161                 return Float.NaN;
1162             }
1163             if (array[i] < min) {
1164                 min = array[i];
1165             }
1166         }
1167         return min;
1168     }
1169 
1170     /**
1171      * Gets the minimum of three {@code float} values.
1172      *
1173      * <p>
1174      * If any value is {@code NaN}, {@code NaN} is returned. Infinity is handled.
1175      * </p>
1176      *
1177      * @param a value 1.
1178      * @param b value 2.
1179      * @param c value 3.
1180      * @return the smallest of the values.
1181      * @see IEEE754rUtils#min(float, float, float) for a version of this method that handles NaN differently.
1182      */
1183     public static float min(final float a, final float b, final float c) {
1184         return Math.min(Math.min(a, b), c);
1185     }
1186 
1187     /**
1188      * Returns the minimum value in an array.
1189      *
1190      * @param array an array, must not be null or empty.
1191      * @return the minimum value in the array.
1192      * @throws NullPointerException     if {@code array} is {@code null}.
1193      * @throws IllegalArgumentException if {@code array} is empty.
1194      * @since 3.4 Changed signature from min(int[]) to min(int...).
1195      */
1196     public static int min(final int... array) {
1197         // Validates input
1198         validateArray(array);
1199         // Finds and returns min
1200         int min = array[0];
1201         for (int j = 1; j < array.length; j++) {
1202             if (array[j] < min) {
1203                 min = array[j];
1204             }
1205         }
1206         return min;
1207     }
1208 
1209     /**
1210      * Gets the minimum of three {@code int} values.
1211      *
1212      * @param a value 1.
1213      * @param b value 2.
1214      * @param c value 3.
1215      * @return the smallest of the values.
1216      */
1217     public static int min(int a, final int b, final int c) {
1218         if (b < a) {
1219             a = b;
1220         }
1221         if (c < a) {
1222             a = c;
1223         }
1224         return a;
1225     }
1226 
1227     /**
1228      * Returns the minimum value in an array.
1229      *
1230      * @param array an array, must not be null or empty.
1231      * @return the minimum value in the array.
1232      * @throws NullPointerException     if {@code array} is {@code null}.
1233      * @throws IllegalArgumentException if {@code array} is empty.
1234      * @since 3.4 Changed signature from min(long[]) to min(long...).
1235      */
1236     public static long min(final long... array) {
1237         // Validates input
1238         validateArray(array);
1239         // Finds and returns min
1240         long min = array[0];
1241         for (int i = 1; i < array.length; i++) {
1242             if (array[i] < min) {
1243                 min = array[i];
1244             }
1245         }
1246         return min;
1247     }
1248 
1249     // 3 param min
1250     /**
1251      * Gets the minimum of three {@code long} values.
1252      *
1253      * @param a value 1.
1254      * @param b value 2.
1255      * @param c value 3.
1256      * @return the smallest of the values.
1257      */
1258     public static long min(long a, final long b, final long c) {
1259         if (b < a) {
1260             a = b;
1261         }
1262         if (c < a) {
1263             a = c;
1264         }
1265         return a;
1266     }
1267 
1268     /**
1269      * Returns the minimum value in an array.
1270      *
1271      * @param array an array, must not be null or empty.
1272      * @return the minimum value in the array.
1273      * @throws NullPointerException     if {@code array} is {@code null}.
1274      * @throws IllegalArgumentException if {@code array} is empty.
1275      * @since 3.4 Changed signature from min(short[]) to min(short...).
1276      */
1277     public static short min(final short... array) {
1278         // Validates input
1279         validateArray(array);
1280         // Finds and returns min
1281         short min = array[0];
1282         for (int i = 1; i < array.length; i++) {
1283             if (array[i] < min) {
1284                 min = array[i];
1285             }
1286         }
1287         return min;
1288     }
1289 
1290     /**
1291      * Gets the minimum of three {@code short} values.
1292      *
1293      * @param a value 1.
1294      * @param b value 2.
1295      * @param c value 3.
1296      * @return the smallest of the values.
1297      */
1298     public static short min(short a, final short b, final short c) {
1299         if (b < a) {
1300             a = b;
1301         }
1302         if (c < a) {
1303             a = c;
1304         }
1305         return a;
1306     }
1307 
1308     /**
1309      * Converts a {@link String} to a {@code byte}, returning {@code zero} if the conversion fails.
1310      *
1311      * <p>
1312      * If the string is {@code null}, {@code zero} is returned.
1313      * </p>
1314      *
1315      * <pre>
1316      *   NumberUtils.toByte(null) = 0
1317      *   NumberUtils.toByte("")   = 0
1318      *   NumberUtils.toByte("1")  = 1
1319      * </pre>
1320      *
1321      * @param str the string to convert, may be null.
1322      * @return the byte represented by the string, or {@code zero} if conversion fails.
1323      * @since 2.5
1324      */
1325     public static byte toByte(final String str) {
1326         return toByte(str, (byte) 0);
1327     }
1328 
1329     /**
1330      * Converts a {@link String} to a {@code byte}, returning a default value if the conversion fails.
1331      *
1332      * <p>
1333      * If the string is {@code null}, the default value is returned.
1334      * </p>
1335      *
1336      * <pre>
1337      *   NumberUtils.toByte(null, 1) = 1
1338      *   NumberUtils.toByte("", 1)   = 1
1339      *   NumberUtils.toByte("1", 0)  = 1
1340      * </pre>
1341      *
1342      * @param str          the string to convert, may be null.
1343      * @param defaultValue the default value.
1344      * @return the byte represented by the string, or the default if conversion fails.
1345      * @since 2.5
1346      */
1347     public static byte toByte(final String str, final byte defaultValue) {
1348         try {
1349             return Byte.parseByte(str);
1350         } catch (final RuntimeException e) {
1351             return defaultValue;
1352         }
1353     }
1354 
1355     /**
1356      * Converts a {@link BigDecimal} to a {@code double}.
1357      *
1358      * <p>
1359      * If the {@link BigDecimal} {@code value} is {@code null}, then the specified default value is returned.
1360      * </p>
1361      *
1362      * <pre>
1363      *   NumberUtils.toDouble(null)                     = 0.0d
1364      *   NumberUtils.toDouble(BigDecimal.valueOf(8.5d)) = 8.5d
1365      * </pre>
1366      *
1367      * @param value the {@link BigDecimal} to convert, may be {@code null}.
1368      * @return the double represented by the {@link BigDecimal} or {@code 0.0d} if the {@link BigDecimal} is {@code null}.
1369      * @since 3.8
1370      */
1371     public static double toDouble(final BigDecimal value) {
1372         return toDouble(value, 0.0d);
1373     }
1374 
1375     /**
1376      * Converts a {@link BigDecimal} to a {@code double}.
1377      *
1378      * <p>
1379      * If the {@link BigDecimal} {@code value} is {@code null}, then the specified default value is returned.
1380      * </p>
1381      *
1382      * <pre>
1383      *   NumberUtils.toDouble(null, 1.1d)                     = 1.1d
1384      *   NumberUtils.toDouble(BigDecimal.valueOf(8.5d), 1.1d) = 8.5d
1385      * </pre>
1386      *
1387      * @param value        the {@link BigDecimal} to convert, may be {@code null}.
1388      * @param defaultValue the default value.
1389      * @return the double represented by the {@link BigDecimal} or the defaultValue if the {@link BigDecimal} is {@code null}.
1390      * @since 3.8
1391      */
1392     public static double toDouble(final BigDecimal value, final double defaultValue) {
1393         return value == null ? defaultValue : value.doubleValue();
1394     }
1395 
1396     /**
1397      * Converts a {@link String} to a {@code double}, returning {@code 0.0d} if the conversion fails.
1398      *
1399      * <p>
1400      * If the string {@code str} is {@code null}, {@code 0.0d} is returned.
1401      * </p>
1402      *
1403      * <pre>
1404      *   NumberUtils.toDouble(null)   = 0.0d
1405      *   NumberUtils.toDouble("")     = 0.0d
1406      *   NumberUtils.toDouble("1.5")  = 1.5d
1407      * </pre>
1408      *
1409      * @param str the string to convert, may be {@code null}.
1410      * @return the double represented by the string, or {@code 0.0d} if conversion fails.
1411      * @since 2.1
1412      */
1413     public static double toDouble(final String str) {
1414         return toDouble(str, 0.0d);
1415     }
1416 
1417     /**
1418      * Converts a {@link String} to a {@code double}, returning a default value if the conversion fails.
1419      *
1420      * <p>
1421      * If the string {@code str} is {@code null}, the default value is returned.
1422      * </p>
1423      *
1424      * <pre>
1425      *   NumberUtils.toDouble(null, 1.1d)   = 1.1d
1426      *   NumberUtils.toDouble("", 1.1d)     = 1.1d
1427      *   NumberUtils.toDouble("1.5", 0.0d)  = 1.5d
1428      * </pre>
1429      *
1430      * @param str          the string to convert, may be {@code null}
1431      * @param defaultValue the default value.
1432      * @return the double represented by the string, or defaultValue if conversion fails.
1433      * @since 2.1
1434      */
1435     public static double toDouble(final String str, final double defaultValue) {
1436         try {
1437             return Double.parseDouble(str);
1438         } catch (final RuntimeException e) {
1439             return defaultValue;
1440         }
1441     }
1442 
1443     /**
1444      * Converts a {@link String} to a {@code float}, returning {@code 0.0f} if the conversion fails.
1445      *
1446      * <p>
1447      * If the string {@code str} is {@code null}, {@code 0.0f} is returned.
1448      * </p>
1449      *
1450      * <pre>
1451      *   NumberUtils.toFloat(null)   = 0.0f
1452      *   NumberUtils.toFloat("")     = 0.0f
1453      *   NumberUtils.toFloat("1.5")  = 1.5f
1454      * </pre>
1455      *
1456      * @param str the string to convert, may be {@code null}.
1457      * @return the float represented by the string, or {@code 0.0f} if conversion fails.
1458      * @since 2.1
1459      */
1460     public static float toFloat(final String str) {
1461         return toFloat(str, 0.0f);
1462     }
1463 
1464     /**
1465      * Converts a {@link String} to a {@code float}, returning a default value if the conversion fails.
1466      *
1467      * <p>
1468      * If the string {@code str} is {@code null}, the default value is returned.
1469      * </p>
1470      *
1471      * <pre>
1472      *   NumberUtils.toFloat(null, 1.1f)   = 1.1f
1473      *   NumberUtils.toFloat("", 1.1f)     = 1.1f
1474      *   NumberUtils.toFloat("1.5", 0.0f)  = 1.5f
1475      * </pre>
1476      *
1477      * @param str          the string to convert, may be {@code null}.
1478      * @param defaultValue the default value.
1479      * @return the float represented by the string, or defaultValue if conversion fails.
1480      * @since 2.1
1481      */
1482     public static float toFloat(final String str, final float defaultValue) {
1483         try {
1484             return Float.parseFloat(str);
1485         } catch (final RuntimeException e) {
1486             return defaultValue;
1487         }
1488     }
1489 
1490     /**
1491      * Converts a {@link String} to an {@code int}, returning {@code zero} if the conversion fails.
1492      *
1493      * <p>
1494      * If the string is {@code null}, {@code zero} is returned.
1495      * </p>
1496      *
1497      * <pre>
1498      *   NumberUtils.toInt(null) = 0
1499      *   NumberUtils.toInt("")   = 0
1500      *   NumberUtils.toInt("1")  = 1
1501      * </pre>
1502      *
1503      * @param str the string to convert, may be null.
1504      * @return the int represented by the string, or {@code zero} if conversion fails.
1505      * @since 2.1
1506      */
1507     public static int toInt(final String str) {
1508         return toInt(str, 0);
1509     }
1510 
1511     /**
1512      * Converts a {@link String} to an {@code int}, returning a default value if the conversion fails.
1513      *
1514      * <p>
1515      * If the string is {@code null}, the default value is returned.
1516      * </p>
1517      *
1518      * <pre>
1519      *   NumberUtils.toInt(null, 1) = 1
1520      *   NumberUtils.toInt("", 1)   = 1
1521      *   NumberUtils.toInt("1", 0)  = 1
1522      * </pre>
1523      *
1524      * @param str          the string to convert, may be null.
1525      * @param defaultValue the default value.
1526      * @return the int represented by the string, or the default if conversion fails.
1527      * @since 2.1
1528      */
1529     public static int toInt(final String str, final int defaultValue) {
1530         try {
1531             return Integer.parseInt(str);
1532         } catch (final RuntimeException e) {
1533             return defaultValue;
1534         }
1535     }
1536 
1537     /**
1538      * Converts a {@link String} to a {@code long}, returning {@code zero} if the conversion fails.
1539      *
1540      * <p>
1541      * If the string is {@code null}, {@code zero} is returned.
1542      * </p>
1543      *
1544      * <pre>
1545      *   NumberUtils.toLong(null) = 0L
1546      *   NumberUtils.toLong("")   = 0L
1547      *   NumberUtils.toLong("1")  = 1L
1548      * </pre>
1549      *
1550      * @param str the string to convert, may be null.
1551      * @return the long represented by the string, or {@code 0} if conversion fails.
1552      * @since 2.1
1553      */
1554     public static long toLong(final String str) {
1555         return toLong(str, 0L);
1556     }
1557 
1558     /**
1559      * Converts a {@link String} to a {@code long}, returning a default value if the conversion fails.
1560      *
1561      * <p>
1562      * If the string is {@code null}, the default value is returned.
1563      * </p>
1564      *
1565      * <pre>
1566      *   NumberUtils.toLong(null, 1L) = 1L
1567      *   NumberUtils.toLong("", 1L)   = 1L
1568      *   NumberUtils.toLong("1", 0L)  = 1L
1569      * </pre>
1570      *
1571      * @param str          the string to convert, may be null.
1572      * @param defaultValue the default value.
1573      * @return the long represented by the string, or the default if conver sion fails.
1574      * @since 2.1
1575      */
1576     public static long toLong(final String str, final long defaultValue) {
1577         try {
1578             return Long.parseLong(str);
1579         } catch (final RuntimeException e) {
1580             return defaultValue;
1581         }
1582     }
1583 
1584     /**
1585      * Converts a {@link BigDecimal} to a {@link BigDecimal} with a scale of two that has been rounded using {@code RoundingMode.HALF_EVEN}. If the supplied
1586      * {@code value} is null, then {@code BigDecimal.ZERO} is returned.
1587      *
1588      * <p>
1589      * Note, the scale of a {@link BigDecimal} is the number of digits to the right of the decimal point.
1590      * </p>
1591      *
1592      * @param value the {@link BigDecimal} to convert, may be null.
1593      * @return the scaled, with appropriate rounding, {@link BigDecimal}.
1594      * @since 3.8
1595      */
1596     public static BigDecimal toScaledBigDecimal(final BigDecimal value) {
1597         return toScaledBigDecimal(value, INTEGER_TWO, RoundingMode.HALF_EVEN);
1598     }
1599 
1600     /**
1601      * Converts a {@link BigDecimal} to a {@link BigDecimal} whose scale is the specified value with a {@link RoundingMode} applied. If the input {@code value}
1602      * is {@code null}, we simply return {@code BigDecimal.ZERO}.
1603      *
1604      * @param value        the {@link BigDecimal} to convert, may be null.
1605      * @param scale        the number of digits to the right of the decimal point.
1606      * @param roundingMode a rounding behavior for numerical operations capable of discarding precision.
1607      * @return the scaled, with appropriate rounding, {@link BigDecimal}.
1608      * @since 3.8
1609      */
1610     public static BigDecimal toScaledBigDecimal(final BigDecimal value, final int scale, final RoundingMode roundingMode) {
1611         if (value == null) {
1612             return BigDecimal.ZERO;
1613         }
1614         return value.setScale(scale, roundingMode == null ? RoundingMode.HALF_EVEN : roundingMode);
1615     }
1616 
1617     /**
1618      * Converts a {@link Double} to a {@link BigDecimal} with a scale of two that has been rounded using {@code RoundingMode.HALF_EVEN}. If the supplied
1619      * {@code value} is null, then {@code BigDecimal.ZERO} is returned.
1620      *
1621      * <p>
1622      * Note, the scale of a {@link BigDecimal} is the number of digits to the right of the decimal point.
1623      * </p>
1624      *
1625      * @param value the {@link Double} to convert, may be null.
1626      * @return the scaled, with appropriate rounding, {@link BigDecimal}.
1627      * @since 3.8
1628      */
1629     public static BigDecimal toScaledBigDecimal(final Double value) {
1630         return toScaledBigDecimal(value, INTEGER_TWO, RoundingMode.HALF_EVEN);
1631     }
1632 
1633     /**
1634      * Converts a {@link Double} to a {@link BigDecimal} whose scale is the specified value with a {@link RoundingMode} applied. If the input {@code value} is
1635      * {@code null}, we simply return {@code BigDecimal.ZERO}.
1636      *
1637      * @param value        the {@link Double} to convert, may be null.
1638      * @param scale        the number of digits to the right of the decimal point.
1639      * @param roundingMode a rounding behavior for numerical operations capable of discarding precision.
1640      * @return the scaled, with appropriate rounding, {@link BigDecimal}.
1641      * @since 3.8
1642      */
1643     public static BigDecimal toScaledBigDecimal(final Double value, final int scale, final RoundingMode roundingMode) {
1644         if (value == null) {
1645             return BigDecimal.ZERO;
1646         }
1647         return toScaledBigDecimal(BigDecimal.valueOf(value), scale, roundingMode);
1648     }
1649 
1650     /**
1651      * Converts a {@link Float} to a {@link BigDecimal} with a scale of two that has been rounded using {@code RoundingMode.HALF_EVEN}. If the supplied
1652      * {@code value} is null, then {@code BigDecimal.ZERO} is returned.
1653      *
1654      * <p>
1655      * Note, the scale of a {@link BigDecimal} is the number of digits to the right of the decimal point.
1656      * </p>
1657      *
1658      * @param value the {@link Float} to convert, may be null.
1659      * @return the scaled, with appropriate rounding, {@link BigDecimal}.
1660      * @since 3.8
1661      */
1662     public static BigDecimal toScaledBigDecimal(final Float value) {
1663         return toScaledBigDecimal(value, INTEGER_TWO, RoundingMode.HALF_EVEN);
1664     }
1665 
1666     /**
1667      * Converts a {@link Float} to a {@link BigDecimal} whose scale is the specified value with a {@link RoundingMode} applied. If the input {@code value} is
1668      * {@code null}, we simply return {@code BigDecimal.ZERO}.
1669      *
1670      * @param value        the {@link Float} to convert, may be null.
1671      * @param scale        the number of digits to the right of the decimal point.
1672      * @param roundingMode a rounding behavior for numerical operations capable of discarding precision.
1673      * @return the scaled, with appropriate rounding, {@link BigDecimal}.
1674      * @since 3.8
1675      */
1676     public static BigDecimal toScaledBigDecimal(final Float value, final int scale, final RoundingMode roundingMode) {
1677         if (value == null) {
1678             return BigDecimal.ZERO;
1679         }
1680         return toScaledBigDecimal(BigDecimal.valueOf(value), scale, roundingMode);
1681     }
1682 
1683     /**
1684      * Converts a {@link String} to a {@link BigDecimal} with a scale of two that has been rounded using {@code RoundingMode.HALF_EVEN}. If the supplied
1685      * {@code value} is null, then {@code BigDecimal.ZERO} is returned.
1686      *
1687      * <p>
1688      * Note, the scale of a {@link BigDecimal} is the number of digits to the right of the decimal point.
1689      * </p>
1690      *
1691      * @param value the {@link String} to convert, may be null.
1692      * @return the scaled, with appropriate rounding, {@link BigDecimal}.
1693      * @since 3.8
1694      */
1695     public static BigDecimal toScaledBigDecimal(final String value) {
1696         return toScaledBigDecimal(value, INTEGER_TWO, RoundingMode.HALF_EVEN);
1697     }
1698 
1699     /**
1700      * Converts a {@link String} to a {@link BigDecimal} whose scale is the specified value with a {@link RoundingMode} applied. If the input {@code value} is
1701      * {@code null}, we simply return {@code BigDecimal.ZERO}.
1702      *
1703      * @param value        the {@link String} to convert, may be null.
1704      * @param scale        the number of digits to the right of the decimal point.
1705      * @param roundingMode a rounding behavior for numerical operations capable of discarding precision.
1706      * @return the scaled, with appropriate rounding, {@link BigDecimal}.
1707      * @since 3.8
1708      */
1709     public static BigDecimal toScaledBigDecimal(final String value, final int scale, final RoundingMode roundingMode) {
1710         if (value == null) {
1711             return BigDecimal.ZERO;
1712         }
1713         return toScaledBigDecimal(createBigDecimal(value), scale, roundingMode);
1714     }
1715 
1716     /**
1717      * Converts a {@link String} to a {@code short}, returning {@code zero} if the conversion fails.
1718      *
1719      * <p>
1720      * If the string is {@code null}, {@code zero} is returned.
1721      * </p>
1722      *
1723      * <pre>
1724      *   NumberUtils.toShort(null) = 0
1725      *   NumberUtils.toShort("")   = 0
1726      *   NumberUtils.toShort("1")  = 1
1727      * </pre>
1728      *
1729      * @param str the string to convert, may be null.
1730      * @return the short represented by the string, or {@code zero} if conversion fails.
1731      * @since 2.5
1732      */
1733     public static short toShort(final String str) {
1734         return toShort(str, (short) 0);
1735     }
1736 
1737     /**
1738      * Converts a {@link String} to an {@code short}, returning a default value if the conversion fails.
1739      *
1740      * <p>
1741      * If the string is {@code null}, the default value is returned.
1742      * </p>
1743      *
1744      * <pre>
1745      *   NumberUtils.toShort(null, 1) = 1
1746      *   NumberUtils.toShort("", 1)   = 1
1747      *   NumberUtils.toShort("1", 0)  = 1
1748      * </pre>
1749      *
1750      * @param str          the string to convert, may be null.
1751      * @param defaultValue the default value.
1752      * @return the short represented by the string, or the default if conversion fails.
1753      * @since 2.5
1754      */
1755     public static short toShort(final String str, final short defaultValue) {
1756         try {
1757             return Short.parseShort(str);
1758         } catch (final RuntimeException e) {
1759             return defaultValue;
1760         }
1761     }
1762 
1763     /**
1764      * Checks if the specified array is neither null nor empty.
1765      *
1766      * @param array the array to check.
1767      * @throws IllegalArgumentException if {@code array} is empty.
1768      * @throws NullPointerException     if {@code array} is {@code null}.
1769      */
1770     private static void validateArray(final Object array) {
1771         Objects.requireNonNull(array, "array");
1772         Validate.isTrue(Array.getLength(array) != 0, "Array cannot be empty.");
1773     }
1774 
1775     private static boolean withDecimalsParsing(final String str, final int beginIdx) {
1776         int decimalPoints = 0;
1777         for (int i = beginIdx; i < str.length(); i++) {
1778             final char ch = str.charAt(i);
1779             final boolean isDecimalPoint = ch == '.';
1780             if (isDecimalPoint) {
1781                 decimalPoints++;
1782             }
1783             if (decimalPoints > 1) {
1784                 return false;
1785             }
1786             if (!isDecimalPoint && !Character.isDigit(ch)) {
1787                 return false;
1788             }
1789         }
1790         return true;
1791     }
1792 
1793     /**
1794      * {@link NumberUtils} instances should NOT be constructed in standard programming. Instead, the class should be used as {@code NumberUtils.toInt("6");}.
1795      *
1796      * <p>
1797      * This constructor is public to permit tools that require a JavaBean instance to operate.
1798      * </p>
1799      *
1800      * @deprecated TODO Make private in 4.0.
1801      */
1802     @Deprecated
1803     public NumberUtils() {
1804         // empty
1805     }
1806 }