将数字用中文读出来
作者:cong_wang1 类型:原创 来源:闪吧
看了dispbbs.asp?boardID=1&ID=227550&page=1这个帖子,本觉得很简单,但是实际动手以后才发觉不是很简单 :P
最初我想了一个方法:就是把这个数字先切分成整数和小数,然后整数部分按大单位切分,比如 亿 万 然后 再单独读取小数部分。 这样做的话 实际在添加大单位的时候每个段的读法都是一样的 比如 12345678 1234(一千二百三十肆) 5678(五千六百七十八)然后两个字段加一个(万) 这样就能读出来了 但是当我在实际写的时候却发现:我忽略了零的情况......于是在做到:
//获得随机数
var nums:Number = random(1000000000);
trace("该数字为: "+nums);
//将随机数转换为字符串对象
var k:String = nums.toString();
trace("转换为字符串后为: "+k);
//获得该数的长度
var kl:Number = k.length;
trace("总共长度为: "+kl);
//kl除以4求余来计算该加的单位
//******
//获得该分的段数
var duanshu:Number = Math.ceil(kl/4);
trace("该分为 "+duanshu+" 段");
//求余获得最前面的一段
var fd:Number = kl%4;
trace("分段的第一段为 "+fd+" 位");
//取出第一段的值
//在这个基础上每4位开始分割
var zid:Array=[];
for (var i = 0; i<duanshu; i++) {
var tem1=fd+4*(i-1)
var tem2=fd+4*i
zid[i]=k.substring(tem1,tem2)
trace(zid[i]+" "+tem1+" "+tem2)
}
}//zid记录切割后的字段
就只能打住了。 重新考虑思考的方向
后来重新想的思路如下 :
对于一个数字 56789365.123 比如这个吧 读作:5千6百7十8万9千3百6十5 点 123
仔细看看 大得思路还是不变的 分割成整数和小数部分 然后分开读
这里整数部分 我是这么想的:
5
五
6
六十五
3
三百六十五
9
玖千三百六十五
8
捌万玖千三百六十五
.......
看明白了没? 读出相应的数 然后加上各自的单位。 然后我们来考虑有“0”的情况
比如:1000001
1
一
0
零十一
0
零百零十一
......
这个地方如果在零十一到了下一次的时候 只要检测是否是0 如果是0 就去掉读出数据的前两位 这样就ok了~
于是得到了下面的代码:(具体不再说明了 思路都有了 慢慢的看吧)
function Transform(whole:Number) {
//将whole转换成为字符串
var whole_st = whole.toString(10);
//分离整数与小数
var zf:Array = whole_st.split(".");
trace("整数:"+zf[0]+" 小数:"+zf[1]);
//求出整数的长度
var len:Number = zf[0].length;
trace("整数长度为: "+len);
//定义单位数组
//****************
//大单位
var dw2:Array = ["", "万", "亿"];
//小单位
var dw1:Array = ["拾", "佰", "千"];
//整数部分用
var dw:Array = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
//小数部分用
var dws:Array = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
//*****************
var k0:Number = 0;
//计小单位
var k1:Number = 0;
//计大单位
var k2:Number = 0;
var str:String = "";
for (var i = 1; i<=len; i++) {
var n:String = zf[0].charAt(len-i);
trace(n);
if (n == "0") {
k0++;
if (k1 != 0) {
str = str.substr(1, str.length);
trace(str+" *");
}
//endif
} else {
k0 = 0;
}
//endifelse
if (k0<=1) {
str = dw[Number(n)]+str;
trace(str);
}
//endif
if (len-i-1>=0) {
if (k1 != 3) {
str = dw1[k1]+str;
k1++;
} else {
k1 = 0;
var temp:String = str.substr(0, 2);
if (temp == "万" || temp == "亿") {
str = str.substr(0, 2);
trace(str+" **");
}
//endif
str = dw2[k2]+str;
}
//endifelse
}
//endif
if (k1 == 3) {
k2++;
}
//endif
}
//endfor
var strdig:String = "";
for (var i = 0; i<zf[1].length; i++) {
var m:String = zf[1].charAt(i);
strdig += dws[Number(m)];
}
//endfor
if (zf[1].length>0) {
str = str+"点"+strdig;
}
trace(str);
}
var nums:Number = random(1000000000);
trace("该数字为: "+nums);
//将随机数转换为字符串对象
var k:String = nums.toString();
trace("转换为字符串后为: "+k);
//获得该数的长度
var kl:Number = k.length;
trace("总共长度为: "+kl);
//kl除以4求余来计算该加的单位
//******
//获得该分的段数
var duanshu:Number = Math.ceil(kl/4);
trace("该分为 "+duanshu+" 段");
//求余获得最前面的一段
var fd:Number = kl%4;
trace("分段的第一段为 "+fd+" 位");
//取出第一段的值
//在这个基础上每4位开始分割
var zid:Array=[];
for (var i = 0; i<duanshu; i++) {
var tem1=fd+4*(i-1)
var tem2=fd+4*i
zid[i]=k.substring(tem1,tem2)
trace(zid[i]+" "+tem1+" "+tem2)
}
}//zid记录切割后的字段
就只能打住了。 重新考虑思考的方向
后来重新想的思路如下 :
对于一个数字 56789365.123 比如这个吧 读作:5千6百7十8万9千3百6十5 点 123
仔细看看 大得思路还是不变的 分割成整数和小数部分 然后分开读
这里整数部分 我是这么想的:
5
五
6
六十五
3
三百六十五
9
玖千三百六十五
8
捌万玖千三百六十五
.......
看明白了没? 读出相应的数 然后加上各自的单位。 然后我们来考虑有“0”的情况
比如:1000001
1
一
0
零十一
0
零百零十一
......
这个地方如果在零十一到了下一次的时候 只要检测是否是0 如果是0 就去掉读出数据的前两位 这样就ok了~
于是得到了下面的代码:(具体不再说明了 思路都有了 慢慢的看吧)
function Transform(whole:Number) {
//将whole转换成为字符串
var whole_st = whole.toString(10);
//分离整数与小数
var zf:Array = whole_st.split(".");
trace("整数:"+zf[0]+" 小数:"+zf[1]);
//求出整数的长度
var len:Number = zf[0].length;
trace("整数长度为: "+len);
//定义单位数组
//****************
//大单位
var dw2:Array = ["", "万", "亿"];
//小单位
var dw1:Array = ["拾", "佰", "千"];
//整数部分用
var dw:Array = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
//小数部分用
var dws:Array = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
//*****************
var k0:Number = 0;
//计小单位
var k1:Number = 0;
//计大单位
var k2:Number = 0;
var str:String = "";
for (var i = 1; i<=len; i++) {
var n:String = zf[0].charAt(len-i);
trace(n);
if (n == "0") {
k0++;
if (k1 != 0) {
str = str.substr(1, str.length);
trace(str+" *");
}
//endif
} else {
k0 = 0;
}
//endifelse
if (k0<=1) {
str = dw[Number(n)]+str;
trace(str);
}
//endif
if (len-i-1>=0) {
if (k1 != 3) {
str = dw1[k1]+str;
k1++;
} else {
k1 = 0;
var temp:String = str.substr(0, 2);
if (temp == "万" || temp == "亿") {
str = str.substr(0, 2);
trace(str+" **");
}
//endif
str = dw2[k2]+str;
}
//endifelse
}
//endif
if (k1 == 3) {
k2++;
}
//endif
}
//endfor
var strdig:String = "";
for (var i = 0; i<zf[1].length; i++) {
var m:String = zf[1].charAt(i);
strdig += dws[Number(m)];
}
//endfor
if (zf[1].length>0) {
str = str+"点"+strdig;
}
trace(str);
}
责任编辑:uufeng 时间:2005年3月8日
- 最近更新
