code: public static Optional<BigInteger> createBigInteger(final String str) {
          if (N.isNullOrEmptyOrBlank(str)) {
              return Optional.empty();
          }
  
          int pos = 0; // offset within string
          int radix = 10;
          boolean negate = false; // need to negate later?
          if (str.startsWith("-")) {
              negate = true;
              pos = 1;
          }
          if (str.startsWith("0x", pos) || str.startsWith("0X", pos)) { // hex
              radix = 16;
              pos += 2;
          } else if (str.startsWith("#", pos)) { // alternative hex (allowed by Long/Integer)
              radix = 16;
              pos++;
          } else if (str.startsWith("0", pos) && str.length() > pos + 1) { // octal; so long as there are additional digits
              radix = 8;
              pos++;
          } // default is to treat as decimal
  
          try {
              final BigInteger value = new BigInteger(str.substring(pos), radix);
              return Optional.of(negate ? value.negate() : value);
          } catch (NumberFormatException e) {
              return Optional.empty();
          }
      }
docs: <p>
  Convert a <code>String</code> to a <code>BigInteger</code>; since 3.2 it
  handles hex (0x or #) and octal (0) notations.
  </p>
  
  <p>
  Returns an empty {@code Optional} if the string is {@code null} or can't be parsed as {@code BigInteger}.
  </p>
  
  @param str a <code>String</code> to convert, may be null
  @return