1 <SCRIPT LANGUAGE="JavaScript">
2 function convertCurrency(currencyDigits) {
3 // Constants:
4 var MAXIMUM_NUMBER = 99999999999.99;
5 // Predefine the radix characters and currency symbols for output:
6 var CN_ZERO = "零";
7 var CN_ONE = "壹";
8 var CN_TWO = "贰";
9 var CN_THREE = "叁";
10 var CN_FOUR = "肆";
11 var CN_FIVE = "伍";
12 var CN_SIX = "陆";
13 var CN_SEVEN = "柒";
14 var CN_EIGHT = "捌";
15 var CN_NINE = "玖";
16 var CN_TEN = "拾";
17 var CN_HUNDRED = "佰";
18 var CN_THOUSAND = "仟";
19 var CN_TEN_THOUSAND = "万";
20 var CN_HUNDRED_MILLION = "亿";
21 var CN_SYMBOL = "人民币";
22 var CN_DOLLAR = "元";
23 var CN_TEN_CENT = "角";
24 var CN_CENT = "分";
25 var CN_INTEGER = "整";
26
27 // Variables:
28 var integral; // Represent integral part of digit number.
29 var decimal; // Represent decimal part of digit number.
30 var outputCharacters; // The output result.
31 var parts;
32 var digits, radices, bigRadices, decimals;
33 var zeroCount;
34 var i, p, d;
35 var quotient, modulus;
36
37 // Validate input string:
38 currencyDigits = currencyDigits.toString();
39 if (currencyDigits == "") {
40 alert("Empty input!");
41 return "";
42 }
43 if (currencyDigits.match(/[^,.\d]/) != null) {
44 alert("Invalid characters in the input string!");
45 return "";
46 }
47 if ((currencyDigits).match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/) == null) {
48 alert("Illegal format of digit number!");
49 return "";
50 }
51
52 // Normalize the format of input digits:
53 currencyDigits = currencyDigits.replace(/,/g, ""); // Remove comma delimiters.
54 currencyDigits = currencyDigits.replace(/^0+/, ""); // Trim zeros at the beginning.
55 // Assert the number is not greater than the maximum number.
56 if (Number(currencyDigits) > MAXIMUM_NUMBER) {
57 alert("Too large a number to convert!");
58 return "";
59 }
60 // http://www.knowsky.com/ Process the coversion from currency digits to characters:
61 // Separate integral and decimal parts before processing coversion:
62 parts = currencyDigits.split(".");
63 if (parts.length > 1) {
64 integral = parts[0];
65 decimal = parts[1];
66 // Cut down redundant decimal digits that are after the second.
67 decimal = decimal.substr(0, 2);
68 }
69 else {
70 integral = parts[0];
71 decimal = "";
72 }
73 // Prepare the characters corresponding to the digits:
74 digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT,CN_NINE);
75 radices = new Array("", CN_TEN, CN_HUNDRED, CN_THOUSAND);
76 bigRadices = new Array("", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);
77 decimals = new Array(CN_TEN_CENT, CN_CENT);
78 // Start processing:
79 outputCharacters = "";
80 // Process integral part if it is larger than 0:
81 if (Number(integral) > 0) {
82 zeroCount = 0;
83 for (i = 0; i < integral.length; i++) {
84 p = integral.length - i - 1;
85 d = integral.substr(i, 1);
86 quotient = p / 4;
87 modulus = p % 4;
88 if (d == "0") {
89 zeroCount++;
90 }
91 else {
92 if (zeroCount > 0)
93 {
94 outputCharacters += digits[0];
95 }
96 zeroCount = 0;
97 outputCharacters += digits[Number(d)] + radices[modulus];
98 }
99 if (modulus == 0 && zeroCount < 4) {
100
101
102 outputCharacters += bigRadices[quotient];
103 }
104 }
105 outputCharacters += CN_DOLLAR;
106 }
107 // Process decimal part if there is:
108 if (decimal != "") {
109 for (i = 0; i < decimal.length; i++) {
110 d = decimal.substr(i, 1);
111 if (d != "0") {
112 outputCharacters += digits[Number(d)] + decimals[i];
113 }
114 }
115 }
116 // Confirm and return the final output string:
117 if (outputCharacters == "") {
118 outputCharacters = CN_ZERO + CN_DOLLAR;
119 }
120 if (decimal == "") {
121 outputCharacters += CN_INTEGER;
122 }
123 //outputCharacters = CN_SYMBOL + outputCharacters;
124 outputCharacters = outputCharacters;
125 return outputCharacters;
126 }//
127
128 var stmp = "";
129 function nst_convert(t)
130 {
131 if(t.value==stmp) return;//如果等于上次输入则返回
132 var ms = t.value.replace(/[^\d\.]/g,"").replace(/(\.\d{2}).+$/,"$1").replace(/^0+([1-9])/,"$1").replace(/^0+$/,"0");
133 //replace(/[^\d\.]/g,"")去掉输入当中不是数字和.的字符
134 //replace(/(\.\d{2}).+$/,"$1")
135 //匹配从字符开始的第一个.后面的所有字符,由于没有使用g标记,
136 //所以只匹配开始第一次 然后用小数点和后两位进行替换以确定数值最后的格式正确 高.
137 //replace(/^0+([1-9])/,"$1") 匹配以多个0开头的数值替换为去掉0后的数值做为数字的第一位 也是匹配开始的一次.
138 //replace(/^0+$/,"0") 匹配以0开始和结束的多个0为一个0 也就是0000000 输入->转换成一个0
139 //以下确定输入的为过滤后的合法数字
140 //alert(ms);
141 var txt = ms.split(".");
142 //alert(txt[0]);
143 //如果ms值不小数点存在则txt[0]=小数点前的值否则等于ms
144 //regexp:/\d{4}(,|$)/ 匹配四位数字和,的集合或者四位数字和字符结尾的集合
145 while(/\d{4}(,|$)/.test(txt[0]))//如果为txt[0]=4123
146 txt[0] = txt[0].replace(/(\d)(\d{3}(,|$))/,"$1,$2");
147 //txt[0].replace(/(\d)(\d{3}(,|$))/,"$1,$2")是将txt[0]进行替换后再赋给它
148 //regexp:/(\d)(\d{3}(,|$))/ 将四个数字份为两组第一个数字为第一位,后三位和其他结尾为每二位
149 //并替换成 第一位,第二位 注意 ,的使用很好. 也就是将4123先替换成4,123
150 //由于此表达式默认采用贪婪匹配所以从数值后向前匹配再通过循环进行再匹配替换从而可以将
151 //12345678分成你想要的123,456,78 楼主彩用(,|$)很精典,因为它略去了第二次匹配时的,问题
152 t.value = stmp = txt[0]+(txt.length>1?"."+txt[1]:"");
153 //最终赋值到输入框中
154 //如果有小数点则加上并购成最终数字否则显示替换后的txt[0]
155 bbb.value = convertCurrency(ms-0);
156 //将ms转换为数字送到number2num1去转换
157 }
158
159 </SCRIPT>
160
161 小写金额:<input type="text" name="aaa" id="aaa" onkeyup="nst_convert(this)"><br>
162 大写金额:<input type="text" name="bbb" id="bbb" size=80>
163
164
165
posted on 2008-12-13 00:15
sw0rd 阅读(378)
评论(0) 编辑 收藏