【问题标题】:Convert a decimal number into one with decimalplaces after last digits将十进制数转换为最后一位后有小数位的数字
【发布时间】:2018-04-07 14:46:59
【问题描述】:

我目前有一个 bash 脚本,它提供了诸如 26084729776630091742 之类的数字。此数字已转换为 26,084729776630091742,最后 18 位为小数位,但如何在 bash 中转换?

(我要转换的数字是一个名为 WEI 的以太坊单位,最后 18 个数字是小数位。所以在前 2 个数字后添加一个点不起作用。)

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    EDIT2:

    echo "128084729776630091742" | awk '{gsub(/,/,"");print substr($0,1,length($0)-18) "," substr($0,length($0)-17)}'
    

    编辑:由于 OP 更改了示例,因此现在添加此代码。

    echo "128,6436xxxx"  | awk '{gsub(/,/,"");print substr($0,1,2) "," substr($0,3)}'
    

    如果您只是在寻找这个特定的示例,那么以下内容可能会对您有所帮助。

    echo "26084729776630091742" | awk '{print substr($0,1,2) "," substr($0,3)}'
    

    解决方案二:使用sed

    echo "26084729776630091742" | sed 's/\(..\)\(.*\)/\1,\2/'
    

    【讨论】:

    • 不幸的是,这不起作用,例如当我有 128,6436xxxx 时,它会显示为 12,86436。 (这个数字是一个以太坊单位,叫做WEI,最后18个数字是小数位)
    • @Preisschild,请立即检查 EDIT 解决方案并告诉我?
    • 请检查更新后的问题,我想将该数字(例如 26084729776630091742)转换为 26,084729776630091742。但是想通过在最后 18 位数字前面添加一个点(或逗号)来转换它,例如128084729776630091742(即 128,084729776630091742)不会转换为 12,8084729776630091742
    • @Preisschild,请检查我的 EDIT2,如果对您有帮助,请告诉我?>'
    【解决方案2】:

    您要查找的内容类似于:"${str:0:2},${str:2}"

    你的例子:

    str="26084729776630091742"
    echo "${str:0:2},${str:2}"
    

    打印26,084729776630091742


    问题已精确编辑

    str="26084729776630091742133"
    echo "${str:0:${#str}-18},${str:${#str}-18}"
    

    以 18 位小数打印 26084,729776630091742133(如果 ${#str} > 18 则可以正常工作)

    【讨论】:

    • 不幸的是,这不起作用,例如当我有 128,6436xxxx 时,它会显示为 12,86436
    • @Preisschild,但您的示例并非如此,请确保您在帖子中正确提及您的要求,请立即更新您的帖子并提供完整的详细信息,并同样告知我们。跨度>
    • @RavinSingh13 抱歉,我认为只需在最后 18 位数字前添加一个点就足够了。
    • 这很容易适应,不过:${str:0:-18},${str:${#str}-18}.
    • 在 7 多年前发布的 bash 4.2 中添加了对负长度的支持。
    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2015-10-07
    • 2017-09-07
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多