这几天,博主碰到了几道关于数字转汉字的javascript算法题,在网上找了很多的答案,发现都有点复杂,于是我决定自己写一篇关于这种算法题的简单解法,以下是博主自己的见解,有不足的地方请多指教。
接下来,我给大家讲解一下几道类似的例题
一、单个数字转汉字的解决方法
1.利用数组存储0-9的汉字,代码如下:
<html>
<head>
<title>数字转换为汉字</title>
</head>
<body>
<script type = "text/javascript">
var ary = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"];
</script>
</body>
</html>
2.接着我们定义一个变量名为str的字符串,并赋值0,,代码如下:
var str = "0";
3.那么我们该怎么把0转换为零呢?使用“对号入座”算法,代码如下:
for(var i = 0;i < ary.length;i++) { for(var j = 0;j < str.length;j++) { if(str.charAt(j) == i) { str = ary[i]; } } }
(1) ary.length和str.length不用多说,这是指ary数组和str字符串的长度。这里我们需要注意的是str.charAt(j)和ary[i],分别指在str这个字符串中索引为j的元素,在ary中索引为i的元素。
(2)在上面这段代码的意思是,从汉字数组的第一个元素开始循环字符串的每一个元素,如果字符串里有对应的数字和i相等,就把此时ary数组中索引为i的元素赋给str(因为索引刚刚好从0开始,所以0代表零)。最后我们只要把str打印出来就可以了。
二、多个数字的转换
从上面这段代码中,我们知道了如何将单个数字转换为汉字的方法,那么我们接下来就讲解多个数字转换为汉字的方法
1.在原有的代码上定义一个新的数组new_str来存储字符串的每个元素,代码如下:
var new_str = new Array(str.length);
2.将str = ary[i]改为new_str[j] = ary[i],代码如下:
new_str[j] = ary[i];
3.最后,只需要把数组打印出来就行了。
document.write(new_str);
然后博主发现一个问题,以上将1221打印为壹,贰,贰,壹,那么我们能不能把逗号去掉呢?可以的,只要写一个循环把数组打印出来,代码如下:
for(var i = 0;i < new_str.length;i++) { document.write(new_str[i]); }
最后打印出来的效果是壹贰贰壹。
三、上面的这些代码只是原样打印出来,能不能打印出“23 = 贰拾三”这种代码呢?当然可以
1.能不能根据23后面的所剩下的几位数,添加不同的汉字,例如23的2后面只剩下1位那么我就在贰后面加上拾,23的3后面没有数了,那就直接打印叁,那就试试看看,代码如下:
for(var i = 0;i < new_str.length;i++) { switch(new_str.length - (i+1)) { case 1: { new_str[i] += "拾"; break; } case 2: { new_str[i] += "佰"; break; } case 3: { new_str[i] += "仟"; break; } case 4: { new_str[i] += "万"; break; } } }
以上代码我只写到了万。拾万,仟万,亿这些需要自己添加下去,所以对可以转换的数字只限制在10万以内。
最后做一下总结,上面这段代码可以把999打印为玖佰玖拾玖,但是会把800打印为捌佰零拾零,所以还是需要在switch()的case里面写一些判断的,这些需要读者们去自己加一些简单的逻辑判断。写这篇随笔的原因,是因为我TM也觉得有些人写得太复杂了,在考虑到只使用数组,循环和条件的前提下我想了这段逻辑比较合乎新手的代码来实现转换。其实我本来是想写一篇java的GC机制的随笔,但是里面涉及到的知识点有点多,只能慢慢写,所以我决定先写一篇关于为什么要配置java环境,还有关于在命令行使用javac和java的一些知识点。 -方法虽然笨,但是实用 zemengcheng