В 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" ;
}
}
Что такое имя функции? Спасибо!
Два сообщения здесь дают ответы:
https://ethereum.stackexchange.com/questions/10811/solidity-concatenate-uint-into-a-string
https://ethereum.stackexchange.com/questions/10932/how-to-convert-string-to-int
С Уважением
Этот вариант был ошибочным, когда я его тестировал, решение от 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Предлагаемый код доказываемых вещей в комментариях к принятому ответу у меня сработало, но мой линтер выдал предупреждение, а именно:
"uintToStr": Avoid assigning to function parameters. [security/no-assign-params]
. Ниже приведено небольшое изменение исходного кода, чтобы исправить это (переназначение параметра_i
другой переменной с именемnumber
):Не работает в солидности 0.8.0 — person Bob Zheng; 13.01.2021
ОБНОВЛЕНИЕ для 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.Эта версия работает с солидностью 0.8.1! Пожалуйста, проголосуйте за. — person Bob Zheng; 06.02.2021
Ответ Concrete_Buddhas не работает в версии 0.8.0. Это исправленная версия:
Если вам нужно дополнительно преобразовать в научную нотацию, например, для более компактного представления чисел, вот модифицированная версия для этой цели:
Некоторые модульные тесты:
Приведенные выше фрагменты кода совместимы с solidity
0.6.0
.