You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:24:04