#!/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 ) 
              
标签:


