¿Cómo convierto un String en un BigInteger?

82

Estoy tratando de leer algunos números realmente grandes de la entrada estándar y sumarlos.

Sin embargo, para agregar a BigInteger, necesito usar BigInteger.valueOf(long);:

private BigInteger sum = BigInteger.valueOf(0);

private void sum(String newNumber) {
    // BigInteger is immutable, reassign the variable:
    sum = sum.add(BigInteger.valueOf(Long.parseLong(newNumber)));
}

Eso funciona bien, pero como BigInteger.valueOf()solo se necesita una long, no puedo agregar números mayores que longel valor máximo (9223372036854775807).

Cada vez que intento agregar 9223372036854775808 o más, obtengo una NumberFormatException (que es completamente esperada).

¿Hay algo así BigInteger.parseBigInteger(String)?

Twinone
fuente

Respuestas:

140

Usando el constructor

BigInteger (Cadena val)

Traduce la representación de cadena decimal de un BigInteger en un BigInteger.

Javadoc

Uku Loskit
fuente
Intenté lo mismo pero enfrenté el problema porque me perdí al importar java.math.BigInteger
Arun
23

Según la documentación :

BigInteger (Cadena val)

Traduce la representación de cadena decimal de un BigInteger en un BigInteger.

Significa que puede usar a Stringpara inicializar un BigIntegerobjeto, como se muestra en el siguiente fragmento:

sum = sum.add(new BigInteger(newNumber));
Vito Gentile
fuente
10

BigInteger tiene un constructor donde puede pasar una cadena como argumento.

prueba a continuación,

private void sum(String newNumber) {
    // BigInteger is immutable, reassign the variable:
    this.sum = this.sum.add(new BigInteger(newNumber));
}
Darshit Chokshi
fuente
8

En lugar de usar valueOf(long)y parse(), puede usar directamente el constructor BigInteger que toma un argumento de cadena:

BigInteger numBig = new BigInteger("8599825996872482982482982252524684268426846846846846849848418418414141841841984219848941984218942894298421984286289228927948728929829");

Eso debería darte el valor deseado.

Usuario9123
fuente
2

Para un bucle en el que desea convertir una arrayde stringsen una arrayde, bigIntegershaga esto:

String[] unsorted = new String[n]; //array of Strings
BigInteger[] series = new BigInteger[n]; //array of BigIntegers

for(int i=0; i<n; i++){
    series[i] = new BigInteger(unsorted[i]); //convert String to bigInteger
}
Omar Mohammed
fuente
0

Si desea convertir texto sin formato (no solo números) a un BigInteger, se encontrará con una excepción, si solo intenta: new BigInteger ("no un número")

En este caso, podría hacerlo así:

public  BigInteger stringToBigInteger(String string){
    byte[] asciiCharacters = string.getBytes(StandardCharsets.US_ASCII);
    StringBuilder asciiString = new StringBuilder();
    for(byte asciiCharacter:asciiCharacters){
        asciiString.append(Byte.toString(asciiCharacter));
    }
    BigInteger bigInteger = new BigInteger(asciiString.toString());
    return bigInteger;
}
Aaron Fritzmaster
fuente