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 (str.isEmpty()) { 360 throw new NumberFormatException("An empty string is not a valid number"); 361 } 362 // Float.valueOf(String) and Double.valueOf(String) trim leading characters up to U+0020, the integral parsers do not. 363 if (str.charAt(0) <= ' ') { 364 throw new NumberFormatException(str + " is not a valid number."); 365 } 366 // Need to deal with all possible hex prefixes here 367 final String[] hexPrefixes = { "0x", "0X", "#" }; 368 final int length = str.length(); 369 final int offset = isSign(str.charAt(0)) ? 1 : 0; 370 int pfxLen = 0; 371 for (final String pfx : hexPrefixes) { 372 if (str.startsWith(pfx, offset)) { 373 pfxLen += pfx.length() + offset; 374 break; 375 } 376 } 377 final char lastChar = str.charAt(length - 1); 378 if (pfxLen > 0) { // we have a hex number 379 char firstSigDigit = 0; // strip leading zeroes 380 for (int i = pfxLen; i < length; i++) { 381 firstSigDigit = str.charAt(i); 382 if (firstSigDigit != '0') { 383 break; 384 } 385 pfxLen++; 386 } 387 final boolean isLongCh = lastChar == 'l' || lastChar == 'L'; 388 int hexDigits = length - pfxLen; 389 if (isLongCh) { 390 hexDigits--; 391 } 392 if (hexDigits > 16 || hexDigits == 16 && firstSigDigit > '7') { // too many for Long 393 return createBigInteger(isLongCh ? str.substring(0, length - 1) : str); 394 } 395 if (isLongCh) { 396 return createLong(str.substring(0, str.length() - 1)); 397 } 398 if (hexDigits > 8 || hexDigits == 8 && firstSigDigit > '7') { // too many for an int 399 return createLong(str); 400 } 401 return createInteger(str); 402 } 403 final String mant; 404 final String dec; 405 final String exp; 406 final int decPos = str.indexOf('.'); 407 final int expPos = str.indexOf('e') + str.indexOf('E') + 1; // assumes both not present 408 // if both e and E are present, this is caught by the checks on expPos (which prevent IOOBE) 409 // and the parsing which will detect if e or E appear in a number due to using the wrong offset 410 // Detect if the return type has been requested 411 final boolean requestType = !Character.isDigit(lastChar) && lastChar != '.'; 412 if (decPos > -1) { // there is a decimal point 413 if (expPos > -1) { // there is an exponent 414 if (expPos <= decPos || expPos > length) { // prevents double exponent causing IOOBE 415 throw new NumberFormatException(str + " is not a valid number."); 416 } 417 dec = str.substring(decPos + 1, expPos); 418 } else { 419 // No exponent, but there may be a type character to remove 420 dec = str.substring(decPos + 1, requestType ? length - 1 : length); 421 } 422 mant = getMantissa(str, decPos); 423 } else { 424 if (expPos > -1) { 425 if (expPos > length) { // prevents double exponent causing IOOBE 426 throw new NumberFormatException(str + " is not a valid number."); 427 } 428 mant = getMantissa(str, expPos); 429 } else { 430 // No decimal, no exponent, but there may be a type character to remove 431 mant = getMantissa(str, requestType ? length - 1 : length); 432 } 433 dec = null; 434 } 435 if (requestType) { 436 if (expPos > -1 && expPos < length - 1) { 437 exp = str.substring(expPos + 1, length - 1); 438 } else { 439 exp = null; 440 } 441 // Requesting a specific type. 442 final String numeric = str.substring(0, length - 1); 443 switch (lastChar) { 444 case 'l': 445 case 'L': 446 if (dec == null && exp == null && (!numeric.isEmpty() && isSign(numeric.charAt(0)) && isDigits(numeric.substring(1)) || isDigits(numeric))) { 447 try { 448 return createLong(numeric); 449 } catch (final NumberFormatException ignored) { 450 // Too big for a long 451 } 452 return createBigInteger(numeric); 453 } 454 throw new NumberFormatException(str + " is not a valid number."); 455 case 'f': 456 case 'F': 457 try { 458 final Float f = createFloat(str); 459 if (!(f.isInfinite() || f.floatValue() == 0.0F && !isZero(mant, dec))) { 460 // If it's too big for a float or the float value = 0 and the string 461 // has non-zeros in it, then float does not have the precision we want 462 return f; 463 } 464 } catch (final NumberFormatException ignored) { 465 // ignore the bad number 466 } 467 // falls-through 468 case 'd': 469 case 'D': 470 try { 471 final Double d = createDouble(str); 472 if (!(d.isInfinite() || d.doubleValue() == 0.0D && !isZero(mant, dec))) { 473 return d; 474 } 475 } catch (final NumberFormatException ignored) { 476 // ignore the bad number 477 } 478 try { 479 return createBigDecimal(numeric); 480 } catch (final NumberFormatException ignored) { 481 // ignore the bad number 482 } 483 // falls-through 484 default: 485 throw new NumberFormatException(str + " is not a valid number."); 486 } 487 } 488 // User doesn't have a preference on the return type, so let's start 489 // small and go from there... 490 if (expPos > -1 && expPos < length - 1) { 491 exp = str.substring(expPos + 1); 492 } else { 493 exp = null; 494 } 495 if (dec == null && exp == null) { // no decimal point and no exponent 496 // Must be an Integer, Long, Biginteger 497 try { 498 return createInteger(str); 499 } catch (final NumberFormatException ignored) { 500 // ignore the bad number 501 } 502 try { 503 return createLong(str); 504 } catch (final NumberFormatException ignored) { 505 // ignore the bad number 506 } 507 return createBigInteger(str); 508 } 509 // Must be a Float, Double, BigDecimal 510 try { 511 final Float f = createFloat(str); 512 final Double d = createDouble(str); 513 if (!f.isInfinite() && !(f.floatValue() == 0.0F && !isZero(mant, dec)) && f.toString().equals(d.toString())) { 514 return f; 515 } 516 if (!d.isInfinite() && !(d.doubleValue() == 0.0D && !isZero(mant, dec))) { 517 final BigDecimal b = createBigDecimal(str); 518 if (b.compareTo(BigDecimal.valueOf(d.doubleValue())) == 0) { 519 return d; 520 } 521 return b; 522 } 523 } catch (final NumberFormatException ignored) { 524 // ignore the bad number 525 } 526 return createBigDecimal(str); 527 } 528 529 /** 530 * Gets the mantissa of the given number. 531 * 532 * @param str The string representation of the number. 533 * @param stopPos The position of the exponent or decimal point. 534 * @return mantissa of the given number. 535 * @throws NumberFormatException Thrown if no mantissa can be retrieved. 536 */ 537 private static String getMantissa(final String str, final int stopPos) { 538 final char firstChar = str.charAt(0); 539 final boolean hasSign = isSign(firstChar); 540 final int length = str.length(); 541 if (length <= (hasSign ? 1 : 0) || length < stopPos) { 542 throw new NumberFormatException(str + " is not a valid number."); 543 } 544 return hasSign ? str.substring(1, stopPos) : str.substring(0, stopPos); 545 } 546 547 /** 548 * Tests whether the given string only contains {@code '0'} characters. 549 * 550 * @param str The String to check. 551 * @return if it is all zeros or {@code null}. 552 */ 553 private static boolean isAllZeros(final String str) { 554 if (str == null) { 555 return true; 556 } 557 for (int i = str.length() - 1; i >= 0; i--) { 558 if (str.charAt(i) != '0') { 559 return false; 560 } 561 } 562 return true; 563 } 564 565 /** 566 * Tests whether the String is a valid Java number. 567 * 568 * <p> 569 * Valid numbers include hexadecimal marked with the {@code 0x} or {@code 0X} qualifier, octal numbers, scientific notation and numbers marked with a type 570 * qualifier (e.g. 123L). 571 * </p> 572 * 573 * <p> 574 * 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} 575 * is not a valid octal value. However, numbers beginning with {@code 0.} are treated as decimal. 576 * </p> 577 * 578 * <p> 579 * {@code null} and empty/blank {@link String} will return {@code false}. 580 * </p> 581 * 582 * <p> 583 * Note, {@link #createNumber(String)} should return a number for every input resulting in {@code true}. 584 * </p> 585 * 586 * @param str The {@link String} to check. 587 * @return {@code true} if the string is a correctly formatted number. 588 * @since 3.5 589 */ 590 public static boolean isCreatable(final String str) { 591 if (StringUtils.isEmpty(str)) { 592 return false; 593 } 594 try { 595 createNumber(str); 596 return true; 597 } catch (final RuntimeException e) { 598 return false; 599 } 600 } 601 602 /** 603 * Tests whether the {@link String} contains only digit characters. 604 * 605 * <p> 606 * {@code null} and empty String will return {@code false}. 607 * </p> 608 * 609 * @param str The {@link String} to check 610 * @return {@code true} if str contains only Unicode numeric 611 */ 612 public static boolean isDigits(final String str) { 613 return StringUtils.isNumeric(str); 614 } 615 616 /** 617 * Tests whether the String is a valid Java number. 618 * 619 * <p> 620 * Valid numbers include hexadecimal marked with the {@code 0x} or {@code 0X} qualifier, octal numbers, scientific notation and numbers marked with a type 621 * qualifier (e.g. 123L). 622 * </p> 623 * 624 * <p> 625 * 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} 626 * is not a valid octal value. However, numbers beginning with {@code 0.} are treated as decimal. 627 * </p> 628 * 629 * <p> 630 * {@code null} and empty/blank {@link String} will return {@code false}. 631 * </p> 632 * 633 * <p> 634 * Note, {@link #createNumber(String)} should return a number for every input resulting in {@code true}. 635 * </p> 636 * 637 * @param str The {@link String} to check. 638 * @return {@code true} if the string is a correctly formatted number. 639 * @since 3.3 the code supports hexadecimal {@code 0Xhhh} an octal {@code 0ddd} validation. 640 * @deprecated This feature will be removed in Lang 4, use {@link NumberUtils#isCreatable(String)} instead. 641 */ 642 @Deprecated 643 public static boolean isNumber(final String str) { 644 return isCreatable(str); 645 } 646 647 /** 648 * Tests whether the given String is a parsable number. 649 * <p> 650 * Parsable numbers include those Strings understood by {@link Integer#parseInt(String)}, {@link Long#parseLong(String)}, {@link Float#parseFloat(String)} 651 * or {@link Double#parseDouble(String)}. This method can be used instead of catching {@link java.text.ParseException} when calling one of those methods. 652 * </p> 653 * <p> 654 * 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 655 * {@link Float#parseFloat(String)} and {@link Double#parseDouble(String)} as are {@code "NaN"}, {@code "Infinity"}, {@code "+Infinity"}, and 656 * {@code "-Infinity"}. Callers requiring finite-only validation should compose with {@link Double#isFinite(double)}. 657 * </p> 658 * <p> 659 * {@code null} and empty String will return {@code false}. 660 * </p> 661 * 662 * @param str The String to check. 663 * @return {@code true} if the string is a parsable number. 664 * @see Integer#parseInt(String) 665 * @see Long#parseLong(String) 666 * @see Double#parseDouble(String) 667 * @see Float#parseFloat(String) 668 * @since 3.4 669 */ 670 public static boolean isParsable(final String str) { 671 return accept(Double::parseDouble, str) || accept(Long::parseLong, str); 672 } 673 674 private static boolean isSign(final char ch) { 675 return ch == '-' || ch == '+'; 676 } 677 678 /** 679 * Tests whether the magnitude of the number is zero. Used by {@link #createNumber(java.lang.String)}. 680 * 681 * <p> 682 * This will check if the magnitude of the number is zero by checking if there are only zeros before and after the decimal place. 683 * </p> 684 * 685 * <p> 686 * 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 687 * called. This eliminates invalid input for example {@code ".", ".D", ".e0"}. 688 * </p> 689 * 690 * <p> 691 * Thus the method only requires checking if both arguments are null, empty or contain only zeros. 692 * </p> 693 * 694 * <p> 695 * Given {@code s = mant + "." + dec}: 696 * </p> 697 * <ul> 698 * <li>{@code true} if s is {@code "0.0"}</li> 699 * <li>{@code true} if s is {@code "0."}</li> 700 * <li>{@code true} if s is {@code ".0"}</li> 701 * <li>{@code false} otherwise (this assumes {@code "."} is not possible)</li> 702 * </ul> 703 * 704 * @param mant The mantissa decimal digits before the decimal point (sign must be removed; never null). 705 * @param dec The decimal digits after the decimal point (exponent and type specifier removed; can be null) 706 * @return true if the magnitude is zero. 707 */ 708 private static boolean isZero(final String mant, final String dec) { 709 return isAllZeros(mant) && isAllZeros(dec); 710 } 711 712 /** 713 * Returns the maximum value in an array. 714 * 715 * @param array An array, must not be null or empty. 716 * @return The maximum value in the array. 717 * @throws NullPointerException Thrown if {@code array} is {@code null}. 718 * @throws IllegalArgumentException Thrown if {@code array} is empty. 719 * @since 3.4 Changed signature from max(byte[]) to max(byte...). 720 */ 721 public static byte max(final byte... array) { 722 // Validates input 723 validateArray(array); 724 // Finds and returns max 725 byte max = array[0]; 726 for (int i = 1; i < array.length; i++) { 727 if (array[i] > max) { 728 max = array[i]; 729 } 730 } 731 return max; 732 } 733 734 /** 735 * Gets the maximum of three {@code byte} values. 736 * 737 * @param a value 1. 738 * @param b value 2. 739 * @param c value 3. 740 * @return The largest of the values. 741 */ 742 public static byte max(byte a, final byte b, final byte c) { 743 if (b > a) { 744 a = b; 745 } 746 if (c > a) { 747 a = c; 748 } 749 return a; 750 } 751 752 /** 753 * Returns the maximum value in an array. 754 * 755 * @param array An array, must not be null or empty. 756 * @return The maximum value in the array. 757 * @throws NullPointerException Thrown if {@code array} is {@code null}. 758 * @throws IllegalArgumentException Thrown if {@code array} is empty. 759 * @see IEEE754rUtils#max(double[]) IEEE754rUtils for a version of this method that handles NaN differently. 760 * @since 3.4 Changed signature from max(double[]) to max(double...) 761 */ 762 public static double max(final double... array) { 763 // Validates input 764 validateArray(array); 765 // Finds and returns max 766 double max = array[0]; 767 for (int j = 1; j < array.length; j++) { 768 max = Math.max(max, array[j]); 769 } 770 return max; 771 } 772 773 /** 774 * Gets the maximum of three {@code double} values. 775 * 776 * <p> 777 * If any value is {@code NaN}, {@code NaN} is returned. Infinity is handled. 778 * </p> 779 * 780 * @param a value 1. 781 * @param b value 2. 782 * @param c value 3. 783 * @return The largest of the values. 784 * @see IEEE754rUtils#max(double, double, double) for a version of this method that handles NaN differently. 785 */ 786 public static double max(final double a, final double b, final double c) { 787 return Math.max(Math.max(a, b), c); 788 } 789 790 /** 791 * Returns the maximum value in an array. 792 * 793 * @param array An array, must not be null or empty. 794 * @return The maximum value in the array. 795 * @throws NullPointerException Thrown if {@code array} is {@code null}. 796 * @throws IllegalArgumentException Thrown if {@code array} is empty. 797 * @see IEEE754rUtils#max(float[]) IEEE754rUtils for a version of this method that handles NaN differently. 798 * @since 3.4 Changed signature from max(float[]) to max(float...). 799 */ 800 public static float max(final float... array) { 801 // Validates input 802 validateArray(array); 803 // Finds and returns max 804 float max = array[0]; 805 for (int j = 1; j < array.length; j++) { 806 max = Math.max(max, array[j]); 807 } 808 return max; 809 } 810 // must handle Long, Float, Integer, Float, Short, 811 // BigDecimal, BigInteger and Byte 812 // useful methods: 813 // Byte.decode(String) 814 // Byte.valueOf(String, int radix) 815 // Byte.valueOf(String) 816 // Double.valueOf(String) 817 // Float.valueOf(String) 818 // Float.valueOf(String) 819 // Integer.valueOf(String, int radix) 820 // Integer.valueOf(String) 821 // Integer.decode(String) 822 // Integer.getInteger(String) 823 // Integer.getInteger(String, int val) 824 // Integer.getInteger(String, Integer val) 825 // Integer.valueOf(String) 826 // Double.valueOf(String) 827 // new Byte(String) 828 // Long.valueOf(String) 829 // Long.getLong(String) 830 // Long.getLong(String, int) 831 // Long.getLong(String, Integer) 832 // Long.valueOf(String, int) 833 // Long.valueOf(String) 834 // Short.valueOf(String) 835 // Short.decode(String) 836 // Short.valueOf(String, int) 837 // Short.valueOf(String) 838 // new BigDecimal(String) 839 // new BigInteger(String) 840 // new BigInteger(String, int radix) 841 // Possible inputs: 842 // 45 45.5 45E7 4.5E7 Hex Oct Binary xxxF xxxD xxxf xxxd 843 // plus minus everything. Prolly more. A lot are not separable. 844 845 /** 846 * Gets the maximum of three {@code float} values. 847 * 848 * <p> 849 * If any value is {@code NaN}, {@code NaN} is returned. Infinity is handled. 850 * </p> 851 * 852 * @param a value 1. 853 * @param b value 2. 854 * @param c value 3. 855 * @return The largest of the values. 856 * @see IEEE754rUtils#max(float, float, float) for a version of this method that handles NaN differently. 857 */ 858 public static float max(final float a, final float b, final float c) { 859 return Math.max(Math.max(a, b), c); 860 } 861 862 /** 863 * Returns the maximum value in an array. 864 * 865 * @param array An array, must not be null or empty. 866 * @return The maximum value in the array. 867 * @throws NullPointerException Thrown if {@code array} is {@code null}. 868 * @throws IllegalArgumentException Thrown if {@code array} is empty. 869 * @since 3.4 Changed signature from max(int[]) to max(int...). 870 */ 871 public static int max(final int... array) { 872 // Validates input 873 validateArray(array); 874 // Finds and returns max 875 int max = array[0]; 876 for (int j = 1; j < array.length; j++) { 877 if (array[j] > max) { 878 max = array[j]; 879 } 880 } 881 return max; 882 } 883 884 /** 885 * Gets the maximum of three {@code int} values. 886 * 887 * @param a value 1. 888 * @param b value 2. 889 * @param c value 3. 890 * @return The largest of the values. 891 */ 892 public static int max(int a, final int b, final int c) { 893 if (b > a) { 894 a = b; 895 } 896 if (c > a) { 897 a = c; 898 } 899 return a; 900 } 901 902 /** 903 * Returns the maximum value in an array. 904 * 905 * @param array An array, must not be null or empty. 906 * @return The maximum value in the array. 907 * @throws NullPointerException Thrown if {@code array} is {@code null}. 908 * @throws IllegalArgumentException Thrown if {@code array} is empty. 909 * @since 3.4 Changed signature from max(long[]) to max(long...). 910 */ 911 public static long max(final long... array) { 912 // Validates input 913 validateArray(array); 914 // Finds and returns max 915 long max = array[0]; 916 for (int j = 1; j < array.length; j++) { 917 if (array[j] > max) { 918 max = array[j]; 919 } 920 } 921 return max; 922 } 923 924 // 3 param max 925 /** 926 * Gets the maximum of three {@code long} values. 927 * 928 * @param a value 1. 929 * @param b value 2. 930 * @param c value 3. 931 * @return The largest of the values. 932 */ 933 public static long max(long a, final long b, final long c) { 934 if (b > a) { 935 a = b; 936 } 937 if (c > a) { 938 a = c; 939 } 940 return a; 941 } 942 943 /** 944 * Returns the maximum value in an array. 945 * 946 * @param array An array, must not be null or empty. 947 * @return The maximum value in the array. 948 * @throws NullPointerException Thrown if {@code array} is {@code null}. 949 * @throws IllegalArgumentException Thrown if {@code array} is empty. 950 * @since 3.4 Changed signature from max(short[]) to max(short...). 951 */ 952 public static short max(final short... array) { 953 // Validates input 954 validateArray(array); 955 // Finds and returns max 956 short max = array[0]; 957 for (int i = 1; i < array.length; i++) { 958 if (array[i] > max) { 959 max = array[i]; 960 } 961 } 962 return max; 963 } 964 965 /** 966 * Gets the maximum of three {@code short} values. 967 * 968 * @param a value 1. 969 * @param b value 2. 970 * @param c value 3. 971 * @return The largest of the values. 972 */ 973 public static short max(short a, final short b, final short c) { 974 if (b > a) { 975 a = b; 976 } 977 if (c > a) { 978 a = c; 979 } 980 return a; 981 } 982 983 /** 984 * Returns the minimum value in an array. 985 * 986 * @param array An array, must not be null or empty. 987 * @return The minimum value in the array. 988 * @throws NullPointerException Thrown if {@code array} is {@code null}. 989 * @throws IllegalArgumentException Thrown if {@code array} is empty. 990 * @since 3.4 Changed signature from min(byte[]) to min(byte...). 991 */ 992 public static byte min(final byte... array) { 993 // Validates input 994 validateArray(array); 995 // Finds and returns min 996 byte min = array[0]; 997 for (int i = 1; i < array.length; i++) { 998 if (array[i] < min) { 999 min = array[i]; 1000 } 1001 } 1002 return min; 1003 } 1004 1005 /** 1006 * Gets the minimum of three {@code byte} values. 1007 * 1008 * @param a value 1. 1009 * @param b value 2. 1010 * @param c value 3. 1011 * @return The smallest of the values. 1012 */ 1013 public static byte min(byte a, final byte b, final byte c) { 1014 if (b < a) { 1015 a = b; 1016 } 1017 if (c < a) { 1018 a = c; 1019 } 1020 return a; 1021 } 1022 1023 /** 1024 * Returns the minimum value in an array. 1025 * 1026 * @param array An array, must not be null or empty. 1027 * @return The minimum value in the array. 1028 * @throws NullPointerException Thrown if {@code array} is {@code null}. 1029 * @throws IllegalArgumentException Thrown if {@code array} is empty. 1030 * @see IEEE754rUtils#min(double[]) IEEE754rUtils for a version of this method that handles NaN differently. 1031 * @since 3.4 Changed signature from min(double[]) to min(double...). 1032 */ 1033 public static double min(final double... array) { 1034 // Validates input 1035 validateArray(array); 1036 // Finds and returns min 1037 double min = array[0]; 1038 for (int i = 1; i < array.length; i++) { 1039 min = Math.min(min, array[i]); 1040 } 1041 return min; 1042 } 1043 1044 /** 1045 * Gets the minimum of three {@code double} values. 1046 * 1047 * <p> 1048 * If any value is {@code NaN}, {@code NaN} is returned. Infinity is handled. 1049 * </p> 1050 * 1051 * @param a value 1. 1052 * @param b value 2. 1053 * @param c value 3. 1054 * @return The smallest of the values. 1055 * @see IEEE754rUtils#min(double, double, double) for a version of this method that handles NaN differently. 1056 */ 1057 public static double min(final double a, final double b, final double c) { 1058 return Math.min(Math.min(a, b), c); 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 Thrown if {@code array} is {@code null}. 1067 * @throws IllegalArgumentException Thrown if {@code array} is empty. 1068 * @see IEEE754rUtils#min(float[]) IEEE754rUtils for a version of this method that handles NaN differently. 1069 * @since 3.4 Changed signature from min(float[]) to min(float...). 1070 */ 1071 public static float min(final float... array) { 1072 // Validates input 1073 validateArray(array); 1074 // Finds and returns min 1075 float min = array[0]; 1076 for (int i = 1; i < array.length; i++) { 1077 min = Math.min(min, array[i]); 1078 } 1079 return min; 1080 } 1081 1082 /** 1083 * Gets the minimum of three {@code float} values. 1084 * 1085 * <p> 1086 * If any value is {@code NaN}, {@code NaN} is returned. Infinity is handled. 1087 * </p> 1088 * 1089 * @param a value 1. 1090 * @param b value 2. 1091 * @param c value 3. 1092 * @return The smallest of the values. 1093 * @see IEEE754rUtils#min(float, float, float) for a version of this method that handles NaN differently. 1094 */ 1095 public static float min(final float a, final float b, final float c) { 1096 return Math.min(Math.min(a, b), c); 1097 } 1098 1099 /** 1100 * Returns the minimum value in an array. 1101 * 1102 * @param array An array, must not be null or empty. 1103 * @return The minimum value in the array. 1104 * @throws NullPointerException Thrown if {@code array} is {@code null}. 1105 * @throws IllegalArgumentException Thrown if {@code array} is empty. 1106 * @since 3.4 Changed signature from min(int[]) to min(int...). 1107 */ 1108 public static int min(final int... array) { 1109 // Validates input 1110 validateArray(array); 1111 // Finds and returns min 1112 int min = array[0]; 1113 for (int j = 1; j < array.length; j++) { 1114 if (array[j] < min) { 1115 min = array[j]; 1116 } 1117 } 1118 return min; 1119 } 1120 1121 /** 1122 * Gets the minimum of three {@code int} values. 1123 * 1124 * @param a value 1. 1125 * @param b value 2. 1126 * @param c value 3. 1127 * @return The smallest of the values. 1128 */ 1129 public static int min(int a, final int b, final int c) { 1130 if (b < a) { 1131 a = b; 1132 } 1133 if (c < a) { 1134 a = c; 1135 } 1136 return a; 1137 } 1138 1139 /** 1140 * Returns the minimum value in an array. 1141 * 1142 * @param array An array, must not be null or empty. 1143 * @return The minimum value in the array. 1144 * @throws NullPointerException Thrown if {@code array} is {@code null}. 1145 * @throws IllegalArgumentException Thrown if {@code array} is empty. 1146 * @since 3.4 Changed signature from min(long[]) to min(long...). 1147 */ 1148 public static long min(final long... array) { 1149 // Validates input 1150 validateArray(array); 1151 // Finds and returns min 1152 long min = array[0]; 1153 for (int i = 1; i < array.length; i++) { 1154 if (array[i] < min) { 1155 min = array[i]; 1156 } 1157 } 1158 return min; 1159 } 1160 1161 // 3 param min 1162 /** 1163 * Gets the minimum of three {@code long} values. 1164 * 1165 * @param a value 1. 1166 * @param b value 2. 1167 * @param c value 3. 1168 * @return The smallest of the values. 1169 */ 1170 public static long min(long a, final long b, final long c) { 1171 if (b < a) { 1172 a = b; 1173 } 1174 if (c < a) { 1175 a = c; 1176 } 1177 return a; 1178 } 1179 1180 /** 1181 * Returns the minimum value in an array. 1182 * 1183 * @param array An array, must not be null or empty. 1184 * @return The minimum value in the array. 1185 * @throws NullPointerException Thrown if {@code array} is {@code null}. 1186 * @throws IllegalArgumentException Thrown if {@code array} is empty. 1187 * @since 3.4 Changed signature from min(short[]) to min(short...). 1188 */ 1189 public static short min(final short... array) { 1190 // Validates input 1191 validateArray(array); 1192 // Finds and returns min 1193 short min = array[0]; 1194 for (int i = 1; i < array.length; i++) { 1195 if (array[i] < min) { 1196 min = array[i]; 1197 } 1198 } 1199 return min; 1200 } 1201 1202 /** 1203 * Gets the minimum of three {@code short} values. 1204 * 1205 * @param a value 1. 1206 * @param b value 2. 1207 * @param c value 3. 1208 * @return The smallest of the values. 1209 */ 1210 public static short min(short a, final short b, final short c) { 1211 if (b < a) { 1212 a = b; 1213 } 1214 if (c < a) { 1215 a = c; 1216 } 1217 return a; 1218 } 1219 1220 /** 1221 * Converts a {@link String} to a {@code byte}, returning {@code zero} if the conversion fails. 1222 * 1223 * <p> 1224 * If the string is {@code null}, {@code zero} is returned. 1225 * </p> 1226 * 1227 * <pre> 1228 * NumberUtils.toByte(null) = 0 1229 * NumberUtils.toByte("") = 0 1230 * NumberUtils.toByte("1") = 1 1231 * </pre> 1232 * 1233 * @param str The string to convert, may be null. 1234 * @return The byte represented by the string, or {@code zero} if conversion fails. 1235 * @since 2.5 1236 */ 1237 public static byte toByte(final String str) { 1238 return toByte(str, (byte) 0); 1239 } 1240 1241 /** 1242 * Converts a {@link String} to a {@code byte}, returning a default value if the conversion fails. 1243 * 1244 * <p> 1245 * If the string is {@code null}, the default value is returned. 1246 * </p> 1247 * 1248 * <pre> 1249 * NumberUtils.toByte(null, 1) = 1 1250 * NumberUtils.toByte("", 1) = 1 1251 * NumberUtils.toByte("1", 0) = 1 1252 * </pre> 1253 * 1254 * @param str The string to convert, may be null. 1255 * @param defaultValue The default value. 1256 * @return The byte represented by the string, or the default if conversion fails. 1257 * @since 2.5 1258 */ 1259 public static byte toByte(final String str, final byte defaultValue) { 1260 try { 1261 return Byte.parseByte(str); 1262 } catch (final RuntimeException e) { 1263 return defaultValue; 1264 } 1265 } 1266 1267 /** 1268 * Converts a {@link BigDecimal} to a {@code double}. 1269 * 1270 * <p> 1271 * If the {@link BigDecimal} {@code value} is {@code null}, then the specified default value is returned. 1272 * </p> 1273 * 1274 * <pre> 1275 * NumberUtils.toDouble(null) = 0.0d 1276 * NumberUtils.toDouble(BigDecimal.valueOf(8.5d)) = 8.5d 1277 * </pre> 1278 * 1279 * @param value The {@link BigDecimal} to convert, may be {@code null}. 1280 * @return The double represented by the {@link BigDecimal} or {@code 0.0d} if the {@link BigDecimal} is {@code null}. 1281 * @since 3.8 1282 */ 1283 public static double toDouble(final BigDecimal value) { 1284 return toDouble(value, 0.0d); 1285 } 1286 1287 /** 1288 * Converts a {@link BigDecimal} to a {@code double}. 1289 * 1290 * <p> 1291 * If the {@link BigDecimal} {@code value} is {@code null}, then the specified default value is returned. 1292 * </p> 1293 * 1294 * <pre> 1295 * NumberUtils.toDouble(null, 1.1d) = 1.1d 1296 * NumberUtils.toDouble(BigDecimal.valueOf(8.5d), 1.1d) = 8.5d 1297 * </pre> 1298 * 1299 * @param value The {@link BigDecimal} to convert, may be {@code null}. 1300 * @param defaultValue The default value. 1301 * @return The double represented by the {@link BigDecimal} or the defaultValue if the {@link BigDecimal} is {@code null}. 1302 * @since 3.8 1303 */ 1304 public static double toDouble(final BigDecimal value, final double defaultValue) { 1305 return value == null ? defaultValue : value.doubleValue(); 1306 } 1307 1308 /** 1309 * Converts a {@link String} to a {@code double}, returning {@code 0.0d} if the conversion fails. 1310 * 1311 * <p> 1312 * If the string {@code str} is {@code null}, {@code 0.0d} is returned. 1313 * </p> 1314 * 1315 * <pre> 1316 * NumberUtils.toDouble(null) = 0.0d 1317 * NumberUtils.toDouble("") = 0.0d 1318 * NumberUtils.toDouble("1.5") = 1.5d 1319 * </pre> 1320 * 1321 * @param str The string to convert, may be {@code null}. 1322 * @return The double represented by the string, or {@code 0.0d} if conversion fails. 1323 * @since 2.1 1324 */ 1325 public static double toDouble(final String str) { 1326 return toDouble(str, 0.0d); 1327 } 1328 1329 /** 1330 * Converts a {@link String} to a {@code double}, returning a default value if the conversion fails. 1331 * 1332 * <p> 1333 * If the string {@code str} is {@code null}, the default value is returned. 1334 * </p> 1335 * 1336 * <pre> 1337 * NumberUtils.toDouble(null, 1.1d) = 1.1d 1338 * NumberUtils.toDouble("", 1.1d) = 1.1d 1339 * NumberUtils.toDouble("1.5", 0.0d) = 1.5d 1340 * </pre> 1341 * 1342 * @param str The string to convert, may be {@code null} 1343 * @param defaultValue The default value. 1344 * @return The double represented by the string, or defaultValue if conversion fails. 1345 * @since 2.1 1346 */ 1347 public static double toDouble(final String str, final double defaultValue) { 1348 try { 1349 return Double.parseDouble(str); 1350 } catch (final RuntimeException e) { 1351 return defaultValue; 1352 } 1353 } 1354 1355 /** 1356 * Converts a {@link String} to a {@code float}, returning {@code 0.0f} if the conversion fails. 1357 * 1358 * <p> 1359 * If the string {@code str} is {@code null}, {@code 0.0f} is returned. 1360 * </p> 1361 * 1362 * <pre> 1363 * NumberUtils.toFloat(null) = 0.0f 1364 * NumberUtils.toFloat("") = 0.0f 1365 * NumberUtils.toFloat("1.5") = 1.5f 1366 * </pre> 1367 * 1368 * @param str The string to convert, may be {@code null}. 1369 * @return The float represented by the string, or {@code 0.0f} if conversion fails. 1370 * @since 2.1 1371 */ 1372 public static float toFloat(final String str) { 1373 return toFloat(str, 0.0f); 1374 } 1375 1376 /** 1377 * Converts a {@link String} to a {@code float}, returning a default value if the conversion fails. 1378 * 1379 * <p> 1380 * If the string {@code str} is {@code null}, the default value is returned. 1381 * </p> 1382 * 1383 * <pre> 1384 * NumberUtils.toFloat(null, 1.1f) = 1.1f 1385 * NumberUtils.toFloat("", 1.1f) = 1.1f 1386 * NumberUtils.toFloat("1.5", 0.0f) = 1.5f 1387 * </pre> 1388 * 1389 * @param str The string to convert, may be {@code null}. 1390 * @param defaultValue The default value. 1391 * @return The float represented by the string, or defaultValue if conversion fails. 1392 * @since 2.1 1393 */ 1394 public static float toFloat(final String str, final float defaultValue) { 1395 try { 1396 return Float.parseFloat(str); 1397 } catch (final RuntimeException e) { 1398 return defaultValue; 1399 } 1400 } 1401 1402 /** 1403 * Converts a {@link String} to an {@code int}, returning {@code zero} if the conversion fails. 1404 * 1405 * <p> 1406 * If the string is {@code null}, {@code zero} is returned. 1407 * </p> 1408 * 1409 * <pre> 1410 * NumberUtils.toInt(null) = 0 1411 * NumberUtils.toInt("") = 0 1412 * NumberUtils.toInt("1") = 1 1413 * </pre> 1414 * 1415 * @param str The string to convert, may be null. 1416 * @return The int represented by the string, or {@code zero} if conversion fails. 1417 * @since 2.1 1418 */ 1419 public static int toInt(final String str) { 1420 return toInt(str, 0); 1421 } 1422 1423 /** 1424 * Converts a {@link String} to an {@code int}, returning a default value if the conversion fails. 1425 * 1426 * <p> 1427 * If the string is {@code null}, the default value is returned. 1428 * </p> 1429 * 1430 * <pre> 1431 * NumberUtils.toInt(null, 1) = 1 1432 * NumberUtils.toInt("", 1) = 1 1433 * NumberUtils.toInt("1", 0) = 1 1434 * </pre> 1435 * 1436 * @param str The string to convert, may be null. 1437 * @param defaultValue The default value. 1438 * @return The int represented by the string, or the default if conversion fails. 1439 * @since 2.1 1440 */ 1441 public static int toInt(final String str, final int defaultValue) { 1442 try { 1443 return Integer.parseInt(str); 1444 } catch (final RuntimeException e) { 1445 return defaultValue; 1446 } 1447 } 1448 1449 /** 1450 * Converts a {@link String} to a {@code long}, returning {@code zero} if the conversion fails. 1451 * 1452 * <p> 1453 * If the string is {@code null}, {@code zero} is returned. 1454 * </p> 1455 * 1456 * <pre> 1457 * NumberUtils.toLong(null) = 0L 1458 * NumberUtils.toLong("") = 0L 1459 * NumberUtils.toLong("1") = 1L 1460 * </pre> 1461 * 1462 * @param str The string to convert, may be null. 1463 * @return The long represented by the string, or {@code 0} if conversion fails. 1464 * @since 2.1 1465 */ 1466 public static long toLong(final String str) { 1467 return toLong(str, 0L); 1468 } 1469 1470 /** 1471 * Converts a {@link String} to a {@code long}, returning a default value if the conversion fails. 1472 * 1473 * <p> 1474 * If the string is {@code null}, the default value is returned. 1475 * </p> 1476 * 1477 * <pre> 1478 * NumberUtils.toLong(null, 1L) = 1L 1479 * NumberUtils.toLong("", 1L) = 1L 1480 * NumberUtils.toLong("1", 0L) = 1L 1481 * </pre> 1482 * 1483 * @param str The string to convert, may be null. 1484 * @param defaultValue The default value. 1485 * @return The long represented by the string, or the default if conversion fails. 1486 * @since 2.1 1487 */ 1488 public static long toLong(final String str, final long defaultValue) { 1489 try { 1490 return Long.parseLong(str); 1491 } catch (final RuntimeException e) { 1492 return defaultValue; 1493 } 1494 } 1495 1496 /** 1497 * 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 1498 * {@code value} is null, then {@code BigDecimal.ZERO} is returned. 1499 * 1500 * <p> 1501 * Note, the scale of a {@link BigDecimal} is the number of digits to the right of the decimal point. 1502 * </p> 1503 * 1504 * @param value The {@link BigDecimal} to convert, may be null. 1505 * @return The scaled, with appropriate rounding, {@link BigDecimal}. 1506 * @since 3.8 1507 */ 1508 public static BigDecimal toScaledBigDecimal(final BigDecimal value) { 1509 return toScaledBigDecimal(value, INTEGER_TWO, RoundingMode.HALF_EVEN); 1510 } 1511 1512 /** 1513 * Converts a {@link BigDecimal} to a {@link BigDecimal} whose scale is the specified value with a {@link RoundingMode} applied. If the input {@code value} 1514 * is {@code null}, we simply return {@code BigDecimal.ZERO}. 1515 * 1516 * @param value The {@link BigDecimal} to convert, may be null. 1517 * @param scale The number of digits to the right of the decimal point. 1518 * @param roundingMode A rounding behavior for numerical operations capable of discarding precision. 1519 * @return The scaled, with appropriate rounding, {@link BigDecimal}. 1520 * @since 3.8 1521 */ 1522 public static BigDecimal toScaledBigDecimal(final BigDecimal value, final int scale, final RoundingMode roundingMode) { 1523 if (value == null) { 1524 return BigDecimal.ZERO; 1525 } 1526 return value.setScale(scale, roundingMode == null ? RoundingMode.HALF_EVEN : roundingMode); 1527 } 1528 1529 /** 1530 * 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 1531 * {@code value} is null, then {@code BigDecimal.ZERO} is returned. 1532 * 1533 * <p> 1534 * Note, the scale of a {@link BigDecimal} is the number of digits to the right of the decimal point. 1535 * </p> 1536 * 1537 * @param value The {@link Double} to convert, may be null. 1538 * @return The scaled, with appropriate rounding, {@link BigDecimal}. 1539 * @since 3.8 1540 */ 1541 public static BigDecimal toScaledBigDecimal(final Double value) { 1542 return toScaledBigDecimal(value, INTEGER_TWO, RoundingMode.HALF_EVEN); 1543 } 1544 1545 /** 1546 * 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 1547 * {@code null}, we simply return {@code BigDecimal.ZERO}. 1548 * 1549 * @param value The {@link Double} to convert, may be null. 1550 * @param scale The number of digits to the right of the decimal point. 1551 * @param roundingMode A rounding behavior for numerical operations capable of discarding precision. 1552 * @return The scaled, with appropriate rounding, {@link BigDecimal}. 1553 * @since 3.8 1554 */ 1555 public static BigDecimal toScaledBigDecimal(final Double value, final int scale, final RoundingMode roundingMode) { 1556 if (value == null) { 1557 return BigDecimal.ZERO; 1558 } 1559 return toScaledBigDecimal(BigDecimal.valueOf(value), scale, roundingMode); 1560 } 1561 1562 /** 1563 * 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 1564 * {@code value} is null, then {@code BigDecimal.ZERO} is returned. 1565 * 1566 * <p> 1567 * Note, the scale of a {@link BigDecimal} is the number of digits to the right of the decimal point. 1568 * </p> 1569 * 1570 * @param value The {@link Float} to convert, may be null. 1571 * @return The scaled, with appropriate rounding, {@link BigDecimal}. 1572 * @since 3.8 1573 */ 1574 public static BigDecimal toScaledBigDecimal(final Float value) { 1575 return toScaledBigDecimal(value, INTEGER_TWO, RoundingMode.HALF_EVEN); 1576 } 1577 1578 /** 1579 * 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 1580 * {@code null}, we simply return {@code BigDecimal.ZERO}. 1581 * 1582 * @param value The {@link Float} to convert, may be null. 1583 * @param scale The number of digits to the right of the decimal point. 1584 * @param roundingMode A rounding behavior for numerical operations capable of discarding precision. 1585 * @return The scaled, with appropriate rounding, {@link BigDecimal}. 1586 * @since 3.8 1587 */ 1588 public static BigDecimal toScaledBigDecimal(final Float value, final int scale, final RoundingMode roundingMode) { 1589 if (value == null) { 1590 return BigDecimal.ZERO; 1591 } 1592 return toScaledBigDecimal(BigDecimal.valueOf(value), scale, roundingMode); 1593 } 1594 1595 /** 1596 * 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 1597 * {@code value} is null, then {@code BigDecimal.ZERO} is returned. 1598 * 1599 * <p> 1600 * Note, the scale of a {@link BigDecimal} is the number of digits to the right of the decimal point. 1601 * </p> 1602 * 1603 * @param value The {@link String} to convert, may be null. 1604 * @return The scaled, with appropriate rounding, {@link BigDecimal}. 1605 * @since 3.8 1606 */ 1607 public static BigDecimal toScaledBigDecimal(final String value) { 1608 return toScaledBigDecimal(value, INTEGER_TWO, RoundingMode.HALF_EVEN); 1609 } 1610 1611 /** 1612 * 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 1613 * {@code null}, we simply return {@code BigDecimal.ZERO}. 1614 * 1615 * @param value The {@link String} to convert, may be null. 1616 * @param scale The number of digits to the right of the decimal point. 1617 * @param roundingMode A rounding behavior for numerical operations capable of discarding precision. 1618 * @return The scaled, with appropriate rounding, {@link BigDecimal}. 1619 * @since 3.8 1620 */ 1621 public static BigDecimal toScaledBigDecimal(final String value, final int scale, final RoundingMode roundingMode) { 1622 if (value == null) { 1623 return BigDecimal.ZERO; 1624 } 1625 return toScaledBigDecimal(createBigDecimal(value), scale, roundingMode); 1626 } 1627 1628 /** 1629 * Converts a {@link String} to a {@code short}, returning {@code zero} if the conversion fails. 1630 * 1631 * <p> 1632 * If the string is {@code null}, {@code zero} is returned. 1633 * </p> 1634 * 1635 * <pre> 1636 * NumberUtils.toShort(null) = 0 1637 * NumberUtils.toShort("") = 0 1638 * NumberUtils.toShort("1") = 1 1639 * </pre> 1640 * 1641 * @param str The string to convert, may be null. 1642 * @return The short represented by the string, or {@code zero} if conversion fails. 1643 * @since 2.5 1644 */ 1645 public static short toShort(final String str) { 1646 return toShort(str, (short) 0); 1647 } 1648 1649 /** 1650 * Converts a {@link String} to an {@code short}, returning a default value if the conversion fails. 1651 * 1652 * <p> 1653 * If the string is {@code null}, the default value is returned. 1654 * </p> 1655 * 1656 * <pre> 1657 * NumberUtils.toShort(null, 1) = 1 1658 * NumberUtils.toShort("", 1) = 1 1659 * NumberUtils.toShort("1", 0) = 1 1660 * </pre> 1661 * 1662 * @param str The string to convert, may be null. 1663 * @param defaultValue The default value. 1664 * @return The short represented by the string, or the default if conversion fails. 1665 * @since 2.5 1666 */ 1667 public static short toShort(final String str, final short defaultValue) { 1668 try { 1669 return Short.parseShort(str); 1670 } catch (final RuntimeException e) { 1671 return defaultValue; 1672 } 1673 } 1674 1675 /** 1676 * Checks if the specified array is neither null nor empty. 1677 * 1678 * @param array The array to check. 1679 * @throws IllegalArgumentException Thrown if {@code array} is empty. 1680 * @throws NullPointerException Thrown if {@code array} is {@code null}. 1681 */ 1682 private static void validateArray(final Object array) { 1683 Objects.requireNonNull(array, "array"); 1684 Validate.isTrue(Array.getLength(array) != 0, "Array cannot be empty."); 1685 } 1686 1687 /** 1688 * {@link NumberUtils} instances should NOT be constructed in standard programming. Instead, the class should be used as {@code NumberUtils.toInt("6");}. 1689 * 1690 * <p> 1691 * This constructor is public to permit tools that require a JavaBean instance to operate. 1692 * </p> 1693 * 1694 * @deprecated TODO Make private in 4.0. 1695 */ 1696 @Deprecated 1697 public NumberUtils() { 1698 // empty 1699 } 1700}