如何使单位数美分在模数下具有前导零?

时间:2017-08-30 14:59:48

标签: shell

RAW_AMT=000078753603

我需要amt = 787536.03

这是代码:

AMT=$(${EXPR} ${RAW_AMT} / 100).$(${EXPR} ${RAW_AMT} % 100)

但显示为AMT = 787536.3

2 个答案:

答案 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的默认操作,打印出结果。