BigInteger выдает число FormatException - PullRequest
0 голосов
/ 28 февраля 2020

Редактировать: Устранена проблема с кодом ниже:

    String tokenId="0x1800000000001289000000000000000000000000000000000000000000000000";

    BigInteger token1;
    if (tokenId.startsWith("0x")){
        token1=new BigInteger(tokenId.substring(2),16);

У меня есть длинная строка, которую мне нужно назначить как BigInteger и передать ее другому методу библиотеки Web3j. Тем не менее, я продолжаю получать исключения числового формата. Любая помощь по этому вопросу?

Ниже приведено исключение метода:

public void getBalance1155(String walletAddress) throws ExecutionException, InterruptedException {

    //define constant values

    Web3j web3j=Web3j.build(new HttpService("https://mainnet.infura.io/v3/<apiKey>>"));
    String contractAddress = "0xfaaFDc07907ff5120a76b34b731b278c38d6043C";
    BigInteger tokenId=new BigInteger("0x1800000000001289000000000000000000000000000000000000000000000000",16);
    NoOpProcessor processor = new NoOpProcessor(web3j);
    Credentials credentials = Credentials.create("privatekey");
    TransactionManager txManager = new FastRawTransactionManager(web3j, credentials, processor);

    //Query Blockchain to get balance of WALLETADDRESS from Contract for given TokenID

    ERC1155 token = ERC1155.load(contractAddress, web3j, txManager, DefaultGasProvider.GAS_PRICE, DefaultGasProvider.GAS_LIMIT);
    RemoteCall<BigInteger> sendCall = token.balanceOf(walletAddress, tokenId);
    BigInteger balance=sendCall.sendAsync().get();
    log.info("balance >>>>>> " +balance);
}

Вот исключение:

java .lang.NumberFormatException: Для ввода строка: «0x180000000000128900000000000000000000000000000000000000000000000000000000000000000000000000» в java .base / java .lang.NumberFormatException.forInputString (NumberFormatException. java: 65) в java .base / * 101L.p. 1020 *: 692) на java .base / java .lang.Long.pongseparLong (Long. java: 817)

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Вам нужно удалить 0x, вы можете получить значение в шестнадцатеричном формате, используя toString(16) на вашем выходе BigInteger

BigInteger tokenId=new BigInteger("1800000000001289000000000000000000000000000000000000000000000000",16);
System.out.println("tokenId.toString(16) = " + tokenId.toString(16));
System.out.println("tokenId.toString(10) = " + tokenId.toString(10));

String originalString = "0x" + tokenId.toString(16);
System.out.println("originalString = " + originalString);

:

tokenId.toString(16) = 1800000000001289000000000000000000000000000000000000000000000000
tokenId.toString(10) = 10855508365998423105807514254364715762064874182780947284375732482585619595264
originalString = 0x1800000000001289000000000000000000000000000000000000000000000000
1 голос
/ 28 февраля 2020

Удалите постороннее 0x из строки.

Документация для конструктора BigInteger говорит

Представление String состоит из необязательный знак минус или плюс, за которым следует последовательность из одной или нескольких цифр в указанном основании.

[...] Строка не может содержать посторонних символов

Нет упоминания о префиксы типа 0x (или 0 для восьмеричного).

0 голосов
/ 06 марта 2020

Поскольку вы уже используете web3j, вы можете использовать Numeric.decodeQuantity("0x1800000000001289000000000000000000000000000000000000000000000000"), это расшифрует шестнадцатеричное число в BigInteger

...