如何在solidity中将uint转换为字符串?

Bob*_*eng 4 blockchain solidity

在 Solidity 中,有没有办法将 int 转换为 string ?

例子:

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" ;
    }



}
Run Code Online (Sandbox Code Playgroud)

什么是函数名?谢谢!

小智 95

solidity ^0.8.0

import "@openzeppelin/contracts/utils/Strings.sol";

Strings.toString(myUINT)
Run Code Online (Sandbox Code Playgroud)

对我有用。

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol#L15-L35

  • 完美的答案。另外,要连接字符串,`+`不起作用,但这应通过`return string(abi.encodePacked("I love ", Strings.toString(i), "persons"));`来完成 (3认同)

小智 18

Solidity 0.8.0 更新:

https://github.com/provable-things/ethereum-api/blob/master/provableAPI_0.6.sol 中uint2str()函数现在已经过时,将无法工作,但这里是更新的代码,使用solidity 0.8.0 :(在上一个版本中有一个溢出错误,但solidity <0.8.0 忽​​略了它,因为它不会影响答案,但现在会引发错误) 也被更改为和 +,-,* 等等将来自 SafeMath 库。bytebytes1

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);
    }
Run Code Online (Sandbox Code Playgroud)

  • 该版本适用于 Solidity 0.8.1!请点赞。:) (2认同)

Tad*_*ust 6

Concrete_Buddhas 答案在 Solidity 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);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这里的两个帖子给出了回应:

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);
    }
Run Code Online (Sandbox Code Playgroud)

问候

  • 这个变体在我测试时有问题,来自 Oraclize https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol 的解决方案可能更好:函数 uint2str(uint i) 内部纯返回(字符串){ if (i == 0) 返回“0”;uint j = i; 单位长度;而 (j != 0){ 长度++; j /= 10; } 字节内存 bstr = 新字节(长度);uint k = 长度 - 1;while (i != 0){ bstr[k--] = byte(48 + i % 10); 我 /= 10; } 返回字符串(bstr); } (2认同)