package cn.eu.util
{
import mx.controls.Alert;
public class RMB
{
private var amount:Number = 0.0;
private static var NUM:String = "零壹贰叁肆伍陆柒捌玖";
private static var UNIT:String = "仟佰拾个";
private static var GRADEUNIT:String = "仟万亿兆";
private static var DOTUNIT:String = "角分厘";
private static var GRADE:int = 4;
private static var nf:NumberFormat = new NumberFormat("#.000");
public function RMB(amount:Number) {
this.amount = amount;
}
public static function toBigAmt(amount:*):String{
var amt:String = nf.format(amount,{group:",",decimal:"."});
var d:Number = new Number(amount);
var dotPart:String = ""; //取小数部分
var intPart:String = ""; //取整数部分
var dotPos:int;
if((dotPos = amt.indexOf('.')) != -1) {
intPart = amt.substring(0, dotPos);
dotPart = amt.substring(dotPos + 1);
}else {
intPart = amt;
}
if(intPart.length > 16) {
Alert.show("数字太大了!");
}
var intBig:String = intToBig(intPart);
var dotBig:String = dotToBig(dotPart);
//以下代码稍做修改,优化显示
if ((dotBig.length == 0)&&(intBig.length != 0)) {
return intBig + "元整";
}else if((dotBig.length == 0)&&(intBig.length == 0)){
return intBig + "零元";
}else if((dotBig.length != 0)&&(intBig.length != 0)) {
return intBig + "元" + dotBig;
}else{
return dotBig;
}
}
private static function dotToBig(dotPart:String):String{
//得到转换后的大写(小数部分)
var strRet:String = "";
for(var i:int=0; i<dotPart.length && i<3; i++){
var num:int;
if((num = int(dotPart.substring(i,i+1))) != 0)
strRet += NUM.substring(num,num+1) + DOTUNIT.substring(i,i+1);
}
return strRet;
}
private static function intToBig(intPart:String):String{
//得到转换后的大写(整数部分)
var grade:int; //级长
var result:String = "";
var strTmp:String = "";
//得到当级长
grade = intPart.length / GRADE;
//调整级次长度
if(intPart.length % GRADE != 0) grade += 1;
//对每级数字处理
for(var i:int = grade; i >= 1; i--){
strTmp = getNowGradeVal(intPart, i);//取得当前级次数字
result += getSubUnit(strTmp);//转换大写
result = dropZero(result);//除零
//加级次单位
if( i>1 ) //末位不加单位
//单位不能相连续
if(getSubUnit(strTmp)== "零零零零"){
result += "零";
}else{
result += GRADEUNIT.substring(i - 1, i);
}
}
return result;
}
private static function getNowGradeVal(strVal:String,grade:int):String{
//得到当前级次的串
var rst:String;
if(strVal.length <= grade * GRADE)
rst = strVal.substring(0,strVal.length - (grade-1)*GRADE);
else
rst = strVal.substring(strVal.length - grade*GRADE,strVal.length - (grade-1)*GRADE);
return rst;
}
private static function getSubUnit(strVal:String):String{
//数值转换
var rst:String = "";
for(var i:int = 0;i< strVal.length; i++){
var s:String = strVal.substring(i,i+1);
var num:int = int(s);
if(num == 0){
//“零”作特殊处理
if(i != strVal.length) //转换后数末位不能为零
rst += "零";
}else{
//If IntKey = 1 And i = 2 Then
//“壹拾”作特殊处理
//“壹拾”合理
//Else
rst += NUM.substring(num,num+1);
//End If
//追加单位
if(i != strVal.length-1 )//个位不加单位
rst += UNIT.substring(i+4-strVal.length,i+4-strVal.length+1);
}
}
return rst;
}
private static function dropZero(strVal:String):String{
//去除连继的“零”
var strRst:String;
var strBefore:String; //前一位置字符
var strNow:String; //现在位置字符
strBefore = strVal.substring(0,1);
strRst = strBefore;
for(var i:int= 1; i<strVal.length; i++) {
strNow = strVal.substring(i, i+1);
if(strNow == "零" && strBefore == "零")
;//同时为零
else
strRst += strNow;
strBefore = strNow;
}
//末位去零
if(strRst.substring(strRst.length-1, strRst.length) == "零")
strRst = strRst.substring(0,strRst.length-1);
return strRst;
}
}
}
AS写的一个RMB转换为大写的例子
最新推荐文章于 2021-05-26 14:18:11 发布