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

如何在Bash脚本中将以太坊WEI单位转换为18位小数格式?

解决Bash中WEI转ETH的数值格式化问题

我来给你几个靠谱的Bash实现方案,核心思路是固定把最后18位转为小数部分——毕竟WEI和ETH的换算规则是1 ETH = 10^18 WEI,和整数部分的位数无关,这也是你说的“前两位加小数点”方法失效的原因。

方法一:纯Bash字符串处理(无外部依赖)

这个方案完全用Bash内置的参数扩展实现,不需要调用其他工具,适合嵌入到你的脚本里:

# 假设你的WEI数值存在变量中
wei="26084729776630091742"
wei_len=${#wei}

if (( wei_len > 18 )); then
    # 长度超过18位:截取前(总长度-18)位作为整数部分,最后18位作为小数部分
    eth="${wei:0:wei_len-18}.${wei: -18}"
elif (( wei_len == 18 )); then
    # 刚好18位:整数部分为0,全部作为小数
    eth="0.${wei}"
else
    # 不足18位:整数部分为0,小数部分补前导零到18位
    eth="0.$(printf "%018d" "$wei")"
fi

echo "$eth"
# 输出:26.084729776630091742

关键细节:

  • 全程用字符串操作,避免Bash整数溢出(因为WEI数值经常会超过64位整数的最大值9223372036854775807)
  • ${wei: -18}是Bash的反向截取语法,专门用来取最后18个字符

方法二:用awk处理(适合管道流场景)

如果你的WEI数值是从其他命令的输出流中获取的,用awk来处理会更方便,比如直接管道传递:

# 示例:假设你的脚本输出WEI数值,直接管道给awk
your_script_that_outputs_wei | awk '{
    len = length($0)
    if (len > 18) {
        int_part = substr($0, 1, len - 18)
        dec_part = substr($0, len - 17, 18)  # awk的substr从1开始计数,所以从第len-17位取18个字符
    } else if (len == 18) {
        int_part = "0"
        dec_part = $0
    } else {
        int_part = "0"
        dec_part = sprintf("%018d", $0)
    }
    print int_part "." dec_part
}'

适用场景:

  • 当你需要批量处理多个WEI数值时,awk的流处理能力会更高效
  • 不需要额外的变量定义,直接对接现有脚本的输出

边缘情况测试

这两个方案都能处理各种边界场景:

  • 输入0 → 输出0.000000000000000000
  • 输入123 → 输出0.000000000000000123
  • 输入1000000000000000000 → 输出1.000000000000000000
  • 输入12345678901234567890123 → 输出123.45678901234567890123

内容的提问来源于stack exchange,提问作者Preisschild

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:47:17