Solidity编程语言(6)--字符串

字符串的定义使用单引号或双引号都可以。这里主要说一下有关string的常见操作,在solidity中不是很方便。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
pragma solidity >=0.4.0 <0.6.0;
//import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract EgString {
string name = 'buff';
string addr = "beijing";

function getAddrLength()public returns(uint){
return bytes(addr).length;//获取字符串
}


function concatenateWithAbi ()public returns(string memory){
return string(abi.encodePacked(name, addr));
}

/*function concatenateWithGit() public returns(string memory){
return name.toSlice().concat(addr.toSlice());
}*/

function compare1() public returns(bool){
return keccak256(bytes(name)) == keccak256(bytes(addr));
}

function compare2() public returns (bool){
for (uint i = 0; i < bytes(name).length; i ++) {
if(bytes(name)[i] != bytes(addr)[i]) {
return false;
}
}
}
/* // parseInt(parseFloat*10^_b)
function parseInt(string memory _a, uint _b) internal returns (uint) {
bytes memory bresult = bytes(_a);
uint mint = 0;
bool decimals = false;
for (uint i=0; i<bresult.length; i++){
if ((bresult[i] >= 48)&&(bresult[i] <= 57)){
if (decimals){
if (_b == 0) break;
else _b--;
}
mint *= 10;
mint += uint(bresult[i]) - 48;
} else if (bresult[i] == 46) decimals = true;
}
if (_b > 0) mint *= 10**_b;
return mint;
}

function uint2str(uint i) internal returns (string memory) {
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 - 1;
while (i != 0){
bstr[k--] = byte(48 + i % 10);
i /= 10;
}
return string(bstr);
}*/
}

###长度
字符串长度的获取需要将string转换成bytes,然后使用bytes的length属性获取长度。

###拼接

  1. 字符串拼接,官网上给出的方法是使用abi.encodePacked方法
  2. 也可以自己写一个方法,思路就是把string转换成bytes,然后将bytes合并成一个大的bytes,最后再将结果bytes转换成string。其中bytes与string转换方法为bytes(string),string(bytes),这里就不写代码了。
  3. 网上有人使用git上的一个工具包,不过我自己编译一直通不过,后续再查下原因。浏览了下代码,可以学习下。
    ###比较
    Solidity同样不支持字符串的比较,需要自己实现,这里提供两种方式(这里不包含其他的工具包方式),当然出于性能要求以及gas消耗情况,可以首先对字符串的长度进行比较,然后再比较内容。这个文章写的不错,而且有gas消耗测试统计。
  4. 比较两字字符串的hash是否相等
  5. 逐个比较每个字符
    ###int转换
    Solidity同样不支持string与int的互相转换。这里可以直接查看工具类oraclize。其转换思路就是把string首先转换成bytes类型,然后逐个遍历,进行数值累加。