摘要:說明本文實(shí)現(xiàn)了一個(gè)從阿拉伯?dāng)?shù)字到中文數(shù)字,以及從中文數(shù)字到阿拉伯?dāng)?shù)字的轉(zhuǎn)換算法。源代碼在這里阿拉伯?dāng)?shù)字轉(zhuǎn)中文給定一個(gè)阿拉伯?dāng)?shù)字,把它轉(zhuǎn)變?yōu)闈h語(yǔ)表示的數(shù)字。
說明
本文實(shí)現(xiàn)了一個(gè)從阿拉伯?dāng)?shù)字到中文數(shù)字,以及從中文數(shù)字到阿拉伯?dāng)?shù)字的轉(zhuǎn)換算法。
同時(shí)用Vuejs和Angularjs同時(shí)實(shí)現(xiàn)了一遍,對(duì)比了一下這兩個(gè)框架的優(yōu)劣。在本例中,Vuejs的方便靈活性完勝Angularjs。
源代碼在這里
阿拉伯?dāng)?shù)字轉(zhuǎn)中文給定一個(gè)阿拉伯?dāng)?shù)字,把它轉(zhuǎn)變?yōu)闈h語(yǔ)表示的數(shù)字。
算法根據(jù)中文的計(jì)數(shù)方法,可以把阿拉伯?dāng)?shù)字按4個(gè)一組分成若干section,每個(gè)section從低到高的單位分別為 “”,“萬(wàn)”,“億”,“萬(wàn)億”。
每個(gè)section內(nèi)的轉(zhuǎn)換方法是一樣的,比如1234,就是"一千二百三十四",加上對(duì)應(yīng)的單位,如“萬(wàn)”,就是“一千二百三十四萬(wàn)”。但是在其中又有些細(xì)節(jié)需要注意:
結(jié)尾的零都忽略,如1200,就是一千二百
中間的零,只需要用一個(gè)零表示,如1004,是一千零四
如果整個(gè)section都是0,全部忽略
如果section在10到19之間,則十位可以省略一;否則,十位上的“一”都不能省。如12就是“十二”,312就是“三百一十二”
中文轉(zhuǎn)阿拉伯?dāng)?shù)字給定一個(gè)中文數(shù)字,如“一千二百三十四萬(wàn)”,把它們轉(zhuǎn)換成阿拉伯?dāng)?shù)字
算法跟上面類似,以“萬(wàn)”,“億”,“萬(wàn)億”為分割位,先把中文分成若干section,每個(gè)section的轉(zhuǎn)換方法一樣,然后section數(shù)值乘以相應(yīng)的權(quán)重,如section為“萬(wàn)”就是乘以10000,“億”是乘以100000000,最低位的section,權(quán)重就是1。
將每個(gè)section的結(jié)果累加就是最終結(jié)果。
每個(gè)section最多8個(gè)漢字,都是以“數(shù)字+單位”的形式成對(duì)出現(xiàn)。將數(shù)字*單位的結(jié)果累加起來就是最終結(jié)果。單位從低到高就是1,10, 100, 1000。
需要注意的細(xì)節(jié)有:
“零”忽略即可
如果第一位是“十”,則數(shù)字默認(rèn)為一。
實(shí)現(xiàn)細(xì)節(jié)分別通過Vuejs和angularjs實(shí)現(xiàn)了一遍,正好可以對(duì)比一下二者的不同。大部分代碼二者都差不多。
但是為了方便閱讀,我對(duì)阿拉伯?dāng)?shù)字采用了千分位分隔,當(dāng)用戶在輸入框中輸入完成按下回車后,輸入框內(nèi)的阿拉伯?dāng)?shù)字自動(dòng)用逗號(hào)分隔。差異注意出現(xiàn)在這個(gè)實(shí)現(xiàn)方法上。
Vuejs實(shí)現(xiàn)// html視圖: // js邏輯: var app = new Vue({ el: "#app", data: { ArabNum: 0, ChineseNum: "", //ChineseSymbole: ["零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖"], ChineseSymbole: ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"], ChineseSection: ["", "萬(wàn)", "億", "萬(wàn)億"], //ChineseUnit: ["", "拾", "佰", "仟"], ChineseUnit: ["", "十", "百", "千"], ChineseUnitArab: { "零": 0, "一": 1, "二": 2, "三": 3, "四": 4, "五": 5, "六": 6, "七": 7, "八": 8, "九": 9, "十": 10, "百": 100, "千": 1000, "萬(wàn)": 10000, "億": 100000000, "萬(wàn)億": 1000000000000, } }, // 區(qū)別主要在這里: filters: { thousandth: { read: function(v) { var str = ""; while (v > 0) { var left = "" + (v % 1000); v = Math.floor(v / 1000); if (v > 0) { while (left.length < 3) { left = "0" + left; } } if (str == "") { str = left; } else { str = left + "," + str; } } return str; }, write: function(v) { return parseInt(v.replace(/,/g, "")); }, }, }, methods: { Arab2Chn: function(v) { ... }, Arab2Chn_section: function(v) { ... }, Chinese2Arab: function(str) { ... }, Chinese2Arab_section: function(str) { ... }, }, computed: { ... }, })
Vuejs方便的地方在于,filter可以用在v-model中,只要分別設(shè)計(jì)read和write函數(shù)即可實(shí)現(xiàn)雙向綁定。read用于model到view的轉(zhuǎn)換,write用于view到model的轉(zhuǎn)換。
Angularjs實(shí)現(xiàn)相比于Vuejs,如果在ng-model中直接使用filter,會(huì)報(bào)錯(cuò):
// error: Expression "ArabNum|thousandth" is non-assignable
為了實(shí)現(xiàn)和Vuejs類似的邏輯,我首先google了一下,發(fā)現(xiàn)只能通過directive實(shí)現(xiàn):
app.directive("thousandth", function() { return { require: "ngModel", link: function(scope, elm, attr, ngModel) { function thousandth(v) { var str = "", v = "" + v; v = v.replace(/,/g, ""); while (v > 0) { var left = "" + (v % 1000); v = Math.floor(v / 1000); if (v > 0) { while (left.length < 3) { left = "0" + left; } } if (str == "") { str = left; } else { str = left + "," + str; } } return str; } elm.on("blur", function(v) { elm.val(thousandth(ngModel.$modelValue)); }); // model -> view ngModel.$formatters.push(function(data) { return thousandth(data) }) // view -> model ngModel.$parsers.push(function(v) { v = "" + v; return parseInt(v.replace(/,/g, "")); }); } } })
可以看到,首先ng的語(yǔ)法要麻煩很多。而且$formatters只有在內(nèi)部的model被改變時(shí),才會(huì)對(duì)view生效。比如input改變時(shí),$parsers先調(diào)用(V-->M),返回值直接給了ngModel,但是$formatters不會(huì)調(diào)用,即M-->V不會(huì)被調(diào)用,否則 M修改V,V又修改M,就是死循環(huán)了。
只有你通過程序修改了ArabNum后,$formatters才會(huì)調(diào)用(M-->V)。所以,必須通過jquery的方式,在blur函數(shù)中,對(duì)element的value進(jìn)行直接修改,才能實(shí)現(xiàn)上述Vue的效果。
總結(jié)只要仔細(xì)一點(diǎn),耐心一點(diǎn),兩個(gè)數(shù)字表示方式的轉(zhuǎn)換還是比較容易實(shí)現(xiàn)的。
通過對(duì)比Vue和angular可以看到,Vue確實(shí)比Ng要方便些。這只是其中的一個(gè)方面。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/54357.html
摘要:然后我立馬丟了一個(gè)以前我寫的一個(gè)轉(zhuǎn)中文數(shù)字的過濾器代碼小寫數(shù)字轉(zhuǎn)換成大寫只處理到零一二三四五六七八九十百千萬(wàn)億十十零接下來就有人回應(yīng)你這種寫法要命了才就這么長(zhǎng),如果呢然后我以項(xiàng)目當(dāng)時(shí)需求就只到位為由回應(yīng)。 有一次在上海前端交流群看見有人在群里發(fā)了一個(gè)求助信息: 請(qǐng)用JavaScript語(yǔ)言編寫一個(gè)函數(shù),要求入口參數(shù)為數(shù)字, 取值范圍是一位數(shù)整數(shù),返回值是字符串,該函數(shù)的功能為:返回該數(shù)...
摘要:常見的字符編碼有編碼,編碼,編碼等。碼只規(guī)定了個(gè)字符的編碼,這在美國(guó)是夠用的。小結(jié)是一種針對(duì)的可變長(zhǎng)度字符編碼,它是的實(shí)現(xiàn)方式之一。 字符編碼是計(jì)算機(jī)編程中不可回避的問題,不管你用 Python2 還是 Python3,亦或是 C++, Java 等,我都覺得非常有必要厘清計(jì)算機(jī)中的字符編碼概念。本文主要分以下幾個(gè)部分介紹: 基本概念 常見字符編碼簡(jiǎn)介 Python 的默認(rèn)編碼 Py...
摘要:字符串常用功能移除空白分割長(zhǎng)度索引切片下面來詳細(xì)介紹下字符串首字母大寫將所有大寫變小寫支持多種國(guó)家語(yǔ)言將大寫變成小寫只支持英文文本居中參數(shù)表示總長(zhǎng)度參數(shù)空白處填充的字符長(zhǎng)度為左右填充,包含自身長(zhǎng)度表示傳入之在字符串中出現(xiàn)的次數(shù)參數(shù)要查找的值 字符串常用功能: 移除空白 分割 長(zhǎng)度 索引 切片 下面來詳細(xì)介紹下 ~ capitalize 字符串首字母大寫 name = xmzncc ...
摘要:所以,哪怕是初學(xué)者,都要了解并能夠解決字符編碼問題。在這個(gè)世界上,有好多不同的字符編碼。目前最新的版本為,已收入超過十萬(wàn)個(gè)字符第十萬(wàn)個(gè)字符在年獲采納。涵蓋的數(shù)據(jù)除了視覺上的字形編碼方法標(biāo)準(zhǔn)的字符編碼外,還包含了字符特性,如大小寫字母。 字符編碼,在編程中,是一個(gè)讓學(xué)習(xí)者比較郁悶的東西,比如一個(gè)str,如果都是英文,好說多了。但恰恰不是如此,中文是我們不得不用的。所以,哪怕是初學(xué)者,都要...
閱讀 2530·2021-08-11 11:16
閱讀 2957·2019-08-30 15:55
閱讀 3356·2019-08-30 12:53
閱讀 1603·2019-08-29 13:28
閱讀 3288·2019-08-28 18:17
閱讀 968·2019-08-26 12:19
閱讀 2493·2019-08-23 18:27
閱讀 738·2019-08-23 18:17