RAW_AMT=000078753603
我需要amt = 787536.03
这是代码:
AMT=$(${EXPR} ${RAW_AMT} / 100).$(${EXPR} ${RAW_AMT} % 100)
但显示为AMT = 787536.3
答案 0 :(得分:2)
printf
可用于以您选择的任何方式格式化数字。特别是,printf '%02d'
打印一个带有两位数字的值,填充左边为零。
以强大而有效的方式为bash写这个(没有forks,没有execs,没有隐式临时文件)可能看起来像:
#!/usr/bin/env bash
shopt -s extglob # enable extglob syntax
raw_amt=000078753603 # original input value
unpadded_amt=${raw_amt##+(0)} # trim leading 0's -- otherwise a value that starts with
# 0s can be treated as octal rather than decimal.
# use a format string to control formatting of our value
printf -v amt '%d.%02d' "$(( unpadded_amt / 100 ))" "$(( unpadded_amt % 100 ))"
echo "$amt"
...或者,与POSIX sh兼容的效率较低的实现:
#!/bin/sh
raw_amt=000078753603 # original input value
# remove trailing zeros. This requires a fork, but not an exec on any shell
# where expr is builtin
unpadded_amt=$(expr "$raw_amt" : '0*\([^0].*\)$')
# use a format string to control formatting of our value
amt=$(printf '%d.%02d' "$(( unpadded_amt / 100 ))" "$(( unpadded_amt % 100 ))")
echo "$amt"
答案 1 :(得分:1)
使用awk更容易:
kent$ raw=000078753603
kent$ awk '{$0*=1;sub(/..$/,".&")}7' <<<$raw
787536.03
$0*=1
将删除前导零sub(...)
会在..$
7
非零数字,将执行awk的默认操作,打印出结果。