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