Как преобразовать uint в строку в solidity?

В Solidity есть ли способ преобразовать свой int в строку?

Пример:

pragma solidity ^0.4.4;

contract someContract {

    uint i;

    function test() pure returns (string) {

      return "Here and Now is Happiness!";

    }

    function love() pure returns(string) {

        i = i +1;

        return "I love " + functionname(i) + " persons" ;
    }



}

Что такое имя функции? Спасибо!

См. также:  Построение таймсерий Юлия
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 5
  1. Bob Zheng

    Два сообщения здесь дают ответы:

    https://ethereum.stackexchange.com/questions/10811/solidity-concatenate-uint-into-a-string

    https://ethereum.stackexchange.com/questions/10932/how-to-convert-string-to-int

    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 + 1);
            for (uint j = 0; j <= i; j++) {
                s[j] = reversed[i - j];
            }
            str = string(s);
        }
    

    С Уважением

    Этот вариант был ошибочным, когда я его тестировал, решение от Oraclize github. com / oraclize / ethereum-api / blob / master / может быть лучше: function uint2str (uint i) internal pure returns (string) {if (i == 0) return 0; uint j = i; длина uint; в то время как (j! = 0) {длина ++; j / = 10; } байты памяти bstr = новые байты (длина); uint k = длина — 1; while (i! = 0) {bstr [k—] = byte (48 + i% 10); i / = 10; } строка возврата (bstr); } person Bob Zheng; 26.02.2018

    Да, я согласен с тем, что версия в ответе у меня не сработала, но та, что указана в github.com/provable-things/ethereum-api/blob/master/ сделал, как указал Дмитрий выше здесь. person Bob Zheng; 12.06.2020

    Также: solc 0.7.0 не любит byte(48 + remainder). Невозможно явно преобразовать uint256 в bytes1. person Bob Zheng; 27.08.2020

  2. Bob Zheng

    Предлагаемый код доказываемых вещей в комментариях к принятому ответу у меня сработало, но мой линтер выдал предупреждение, а именно: "uintToStr": Avoid assigning to function parameters. [security/no-assign-params]. Ниже приведено небольшое изменение исходного кода, чтобы исправить это (переназначение параметра _i другой переменной с именем number):

        /// @notice converts number to string
        /// @dev source: https://github.com/provable-things/ethereum-api/blob/master/oraclizeAPI_0.5.sol#L1045
        /// @param _i integer to convert
        /// @return _uintAsString
        function uintToStr(uint _i) internal pure returns (string memory _uintAsString) {
            uint number = _i;
            if (number == 0) {
                return "0";
            }
            uint j = number;
            uint len;
            while (j != 0) {
                len++;
                j /= 10;
            }
            bytes memory bstr = new bytes(len);
            uint k = len - 1;
            while (number != 0) {
                bstr[k--] = byte(uint8(48 + number % 10));
                number /= 10;
            }
            return string(bstr);
        }
    

    Не работает в солидности 0.8.0 person Bob Zheng; 13.01.2021

  3. Bob Zheng

    ОБНОВЛЕНИЕ для Solidity 0.8.0:

    Функция uint2str() из https://github.com/provable-things/ethereum-api/blob/master/provableAPI_0.6.sol теперь устарел и не будет работать, но вот обновленный код, который использует solidity 0.8.0: (в последняя версия, но solidity ‹0.8.0 проигнорировала это, поскольку это не повлияло на ответ, но теперь выдает ошибку) byte также был изменен на bytes1 и +, -, * и т.д. работают так же, как и из библиотеки SafeMath.

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
            if (_i == 0) {
                return "0";
            }
            uint j = _i;
            uint len;
            while (j != 0) {
                len++;
                j /= 10;
            }
            bytes memory bstr = new bytes(len);
            uint k = len;
            while (_i != 0) {
                k = k-1;
                uint8 temp = (48 + uint8(_i - _i / 10 * 10));
                bytes1 b1 = bytes1(temp);
                bstr[k] = b1;
                _i /= 10;
            }
            return string(bstr);
        }
    

    Эта версия работает с солидностью 0.8.1! Пожалуйста, проголосуйте за. :) person Bob Zheng; 06.02.2021

  4. Bob Zheng

    Ответ Concrete_Buddhas не работает в версии 0.8.0. Это исправленная версия:

     function uint2str(
      uint256 _i
    )
      internal
      pure
      returns (string memory str)
    {
      if (_i == 0)
      {
        return "0";
      }
      uint256 j = _i;
      uint256 length;
      while (j != 0)
      {
        length++;
        j /= 10;
      }
      bytes memory bstr = new bytes(length);
      uint256 k = length;
      j = _i;
      while (j != 0)
      {
        bstr[--k] = bytes1(uint8(48 + j % 10));
        j /= 10;
      }
      str = string(bstr);
    }
    
  5. Bob Zheng

    Если вам нужно дополнительно преобразовать в научную нотацию, например, для более компактного представления чисел, вот модифицированная версия для этой цели:

    function uintToString(uint v, bool scientific) public pure returns (string memory str) {
    
        if (v == 0) {
            return "0";
        }
    
        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(uint8(48 + remainder));
        }
    
        uint zeros = 0;
        if (scientific) {
            for (uint k = 0; k < i; k++) {
                if (reversed[k] == '0') {
                    zeros++;
                } else {
                    break;
                }
            }
        }
    
        uint len = i - (zeros > 2 ? zeros : 0);
        bytes memory s = new bytes(len);
        for (uint j = 0; j < len; j++) {
            s[j] = reversed[i - j - 1];
        }
    
        str = string(s);
    
        if (scientific && zeros > 2) {
            str = string(abi.encodePacked(s, "e", uintToString(zeros, false)));
        }
    }
    

    Некоторые модульные тесты:

    function testUintToString() public {
    
        Assert.equal(Utils.uintToString(0, true), '0', '0');
        Assert.equal(Utils.uintToString(1, true), '1', '1');
        Assert.equal(Utils.uintToString(123, true), '123', '123');
        Assert.equal(Utils.uintToString(107680546035, true), '107680546035', '107680546035');
        Assert.equal(Utils.uintToString(1e9, true), '1e9', '1e9');
        Assert.equal(Utils.uintToString(1 ether, true), '1e18', '1 ether');
        Assert.equal(Utils.uintToString(550e8, true), '55e9', '55e9');
    }
    

    Приведенные выше фрагменты кода совместимы с solidity 0.6.0.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: