- 论坛徽章:
- 0
|
- #!/bin/ksh
- # Program Name : Num2Chn.sh
- # Programmer : 吕永辉(仙桃市信用联社)
- # 首先判断输入的是否为数字
- printf "%.2f" $1 >/dev/null 2>&1 3>&1 || {
- echo "输入非法!!!";exit
- }
- # 定义数字数组
- Num[0]="零" Num[1]="壹" Num[2]="贰" Num[3]="叁" Num[4]="肆" Num[5]="伍"
- Num[6]="陆" Num[7]="柒" Num[8]="捌" Num[9]="玖"
- # 定义金额单位数组
- Unit[1]="分" Unit[2]="角" Unit[3]="元" Unit[4]="拾" Unit[5]="佰" Unit[6]="仟"
- Unit[7]="万" Unit[11]="亿"
- # 处理负数的情况(红字)
- [ `echo $1 | grep "-"` ] && {
- NumStr=`echo $1 | sed 's/^.//'`
- RedFlag="(红)"
- } || {
- NumStr=$1
- RedFlag=""
- }
- # 初始化输入数字数组
- i=1
- for TmpC in `printf "%.2f" $NumStr | awk -F "." '{print $1$2}' | sed 's/./& /g'`
- do
- Nums[$i]=$TmpC
- i=`expr $i + 1`
- done
- j=${#Nums[@]} # 为循环计数变量附初值为输入数字的长度
- k=1 # 为循环定位变量附初值(用于确定金额单位)
- ChnNum="" # 初始化大写金额字符串
- while
- [ $j -eq 0 ] && break
- [ $k -gt 11 ] && {
- ChnNum=${Num[${Nums[$j]}]}${Unit[`expr $k - 8 `]}$ChnNum
- j=`expr $j - 1`
- k=`expr $k + 1`
- continue
- }
- [ $k -gt 7 -a $k -lt 11 ] && {
- ChnNum=${Num[${Nums[$j]}]}${Unit[`expr $k - 4 `]}$ChnNum
- j=`expr $j - 1`
- k=`expr $k + 1`
- continue
- }
- ChnNum=${Num[${Nums[$j]}]}${Unit[$k]}$ChnNum
- do
- j=`expr $j - 1`
- k=`expr $k + 1`
- done
- ChnNum=`echo $RedFlag$ChnNum | sed 's/零分/整/' | sed 's/零角/零/g' \
- | sed 's/零拾/零/g' | sed 's/零佰/零/g' | sed 's/零仟/零/g'\
- | sed 's/零整/整/' | sed 's/零零零零万/零/'`
- # 下面的循环用于去掉字符串中连续的零
- while
- [ `echo $ChnNum | grep "零零"` ] || {
- ChnNum=`echo $ChnNum | sed 's/零元/元/'| sed 's/零万/万/' \
- | sed 's/零亿/亿/' | sed 's/^元//' | sed 's/^零//' | sed 's/^整$/零元&/`
- break
- }
- do
- ChnNum=`echo $ChnNum | sed 's/零零/零/g'`
- done
- echo $ChnNum
复制代码
(调试环境:SCO OpenServer 5.0.5 、ksh )
我把原始脚本传上来,各位可以保存后改名直接拷贝到SCO上执行。 |
|