Solidity整数转罗马数字代码ParserError报错及实现问题咨询
解答
1. ParserError: Expected primary expression 报错原因
该报错由两处语法错误共同触发:
Numerals函数中d(4-l+i)[ds[i]]写法不符合Solidity语法规则。你尝试通过枚举值动态引用变量名的写法是Python等动态语言的习惯,静态类型的Solidity不支持该操作,enum本质是uint类型别名,无法直接关联你预先定义的四个mapping变量,编译器无法解析该表达式。Numerals函数中for循环的分隔符错误,你写的for (i=0; i<l, i++)应该改为for (uint i=0; i<l; i++),循环条件和增量之间用分号分隔,不是逗号。
2. 其他明显错误
语法类错误
- 所有循环变量
i未显式声明类型,Solidity要求所有变量必须提前声明类型,需统一改为uint i。 solution函数的return语句写在for循环内部,循环仅会执行一次就返回,且当输入为0时循环不触发,函数无返回值。Length函数中x / 10;没有赋值给x,循环永远不会终止,会无限消耗gas,需改为x = x / 10;。Concatenate函数的字符串拼接逻辑完全错误:Solidity中byte是单字节类型,无法直接将字符串转成byte做位运算实现拼接,且变量a_、b_未声明类型。- Solidity 0.4.x 不支持在函数内部定义非storage类型的mapping,你在
Numerals函数内定义的四个mapping无法正常存储数据,运行会报错。 - 缺少入参校验:罗马数字最大可表示3999,输入大于等于4000的数值会返回错误结果。
逻辑类错误
- 用enum关联mapping的思路不可行,建议直接根据当前数字的位数匹配对应的符号规则,比如千位对应千位符号集,百位对应百位符号集即可。
- 字符串拼接需通过字节数组实现:正确的拼接逻辑是将两个入参字符串转为bytes类型,新建长度为两者长度之和的bytes数组,逐个拷贝字节后再转成string返回。
调整建议
你原本拆分数字、按位匹配符号的整体思路是正确的,只需要调整不符合Solidity语法的部分即可:
- 将四个位的罗马符号替换为长度为10的固定字符串数组,不需要使用mapping
- 按位获取数字后,直接根据当前位的量级取对应数组中的字符串
- 替换为正确的字节数组拼接逻辑
- 增加入参校验,限制输入范围为1~3999
内容的提问来源于stack exchange,提问作者Brad Graham
相关产品推荐
相关产品推荐

