Solidity объединяет uint в строку?

Как мне объединить целое число в строку, используя плотность?

Например, скажем, у меня есть следующее:

uint myInteger = 12

Как я могу создать следующую строку "My integer is: 12", где 12 является значением myInteger.

Другими словами,"My integer is: " + myInteger

Связанное и, возможно, решение: ethereum.stackexchange.com/q/729/87

Ответы (3)

Попробуйте следующее:

pragma solidity ^0.4.4;

contract TestIntToString {

    string public result;

    function TestIntToString() {
        // result = uintToString(12345678901234567890);
        result = appendUintToString("My integer is: ", 1234567890);
    }

    function uintToString(uint v) constant returns (string str) {
        uint maxlength = 100;
        bytes memory reversed = new bytes(maxlength);
        uint i = 0;
        while (v != 0) {
            uint remainder = v % 10;
            v = v / 10;
            reversed[i++] = byte(48 + remainder);
        }
        bytes memory s = new bytes(i);
        for (uint j = 0; j < i; j++) {
            s[j] = reversed[i - 1 - j];
        }
        str = string(s);
    }

    function appendUintToString(string inStr, uint v) constant returns (string str) {
        uint maxlength = 100;
        bytes memory reversed = new bytes(maxlength);
        uint i = 0;
        while (v != 0) {
            uint remainder = v % 10;
            v = v / 10;
            reversed[i++] = byte(48 + remainder);
        }
        bytes memory inStrb = bytes(inStr);
        bytes memory s = new bytes(inStrb.length + i);
        uint j;
        for (j = 0; j < inStrb.length; j++) {
            s[j] = inStrb[j];
        }
        for (j = 0; j < i; j++) {
            s[j + inStrb.length] = reversed[i - 1 - j];
        }
        str = string(s);
    }
}

Вот экран Browser Solidity, показывающий работу этого алгоритма:

введите описание изображения здесь

Есть ли причина, по которой maxlength равна 100, а не 78? Максимальное количество цифр, возможное для uint256, равно 78.
Больше не работает. Remix выдает ошибку, говорящую explicit conversion from uint256 to bytes1 is unsupportedо строкеreversed[i++] = byte(48 + remainder)
для проблемы преобразования используйтеbyte(uint8(48 + remainder))

Это мой первый ответ здесь :)

  1. Вы можете использовать openzeppelin Strings.sol и использовать метод toString(value) для преобразования числа в строку.

toString(value) : Преобразует uint256 в его десятичное строковое представление ASCII.

  1. Теперь для concat мы можем использовать string.concat() [доступно после версии Solidity 0.8.12].

это будет выглядеть так:

pragma solidity ^0.8.12;
import "@openzeppelin/contracts/utils/Strings.sol";

contract NumToStr {
    
    function testConcat(uint256 num1) public pure returns (string memory) {
        return string.concat("The number is: ",Strings.toString(num1), ", Cool!!");
    }
}

в Strings.sol от openzeppelin есть и другие методы, например:

toHexString(value)

toHexString(value, length)

toHexString(addr)
  • Вы можете прочитать больше о библиотеке Strings в документации openzeppelin здесь :

  • Вместо string.concat() мы также можем использовать abi.encodePacked(str1, str2) , который возвращает байты (см. здесь ). Затем мы можем преобразовать байты в строку с помощью string(bytesVal) :

function testConcat(uint256 num1) public pure returns (string memory) {
        return string(abi.encodePacked("The number is: ",Strings.toString(num1), ", Cool!!"));
    }

Но я знаю, что этот подход довольно хакерский.

function strConcat(string _a, string _b, string _c, string _d, string _e) internal returns (string){
    bytes memory _ba = bytes(_a);
    bytes memory _bb = bytes(_b);
    bytes memory _bc = bytes(_c);
    bytes memory _bd = bytes(_d);
    bytes memory _be = bytes(_e);
    string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
    bytes memory babcde = bytes(abcde);
    uint k = 0;
    for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
    for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
    for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
    for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
    for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
    return string(babcde);
}

function strConcat(string _a, string _b, string _c, string _d) internal returns (string) {
    return strConcat(_a, _b, _c, _d, "");
}

function strConcat(string _a, string _b, string _c) internal returns (string) {
    return strConcat(_a, _b, _c, "", "");
}

function strConcat(string _a, string _b) internal returns (string) {
    return strConcat(_a, _b, "", "", "");
}
Я не думаю, что этот ответ касается того, как преобразовать целое число в строку.
Разве это не просто копия ответа из предложенной дублирующей темы? В этом случае вы также должны пометить вопрос как дубликат.