国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

阿拉伯-漢字-數字轉換

王軍 / 2262人閱讀

摘要:說明本文實現了一個從阿拉伯數字到中文數字,以及從中文數字到阿拉伯數字的轉換算法。源代碼在這里阿拉伯數字轉中文給定一個阿拉伯數字,把它轉變為漢語表示的數字。

說明

本文實現了一個從阿拉伯數字到中文數字,以及從中文數字到阿拉伯數字的轉換算法。
同時用Vuejs和Angularjs同時實現了一遍,對比了一下這兩個框架的優劣。在本例中,Vuejs的方便靈活性完勝Angularjs。

源代碼在這里

阿拉伯數字轉中文

給定一個阿拉伯數字,把它轉變為漢語表示的數字。

算法

根據中文的計數方法,可以把阿拉伯數字按4個一組分成若干section,每個section從低到高的單位分別為 “”,“萬”,“億”,“萬億”。

每個section內的轉換方法是一樣的,比如1234,就是"一千二百三十四",加上對應的單位,如“萬”,就是“一千二百三十四萬”。但是在其中又有些細節需要注意:

結尾的零都忽略,如1200,就是一千二百

中間的零,只需要用一個零表示,如1004,是一千零四

如果整個section都是0,全部忽略

如果section在10到19之間,則十位可以省略一;否則,十位上的“一”都不能省。如12就是“十二”,312就是“三百一十二”

中文轉阿拉伯數字

給定一個中文數字,如“一千二百三十四萬”,把它們轉換成阿拉伯數字

算法

跟上面類似,以“萬”,“億”,“萬億”為分割位,先把中文分成若干section,每個section的轉換方法一樣,然后section數值乘以相應的權重,如section為“萬”就是乘以10000,“億”是乘以100000000,最低位的section,權重就是1。
將每個section的結果累加就是最終結果。

每個section最多8個漢字,都是以“數字+單位”的形式成對出現。將數字*單位的結果累加起來就是最終結果。單位從低到高就是1,10, 100, 1000。

需要注意的細節有:

“零”忽略即可

如果第一位是“十”,則數字默認為一。

實現細節

分別通過Vuejs和angularjs實現了一遍,正好可以對比一下二者的不同。大部分代碼二者都差不多。

但是為了方便閱讀,我對阿拉伯數字采用了千分位分隔,當用戶在輸入框中輸入完成按下回車后,輸入框內的阿拉伯數字自動用逗號分隔。差異注意出現在這個實現方法上。

Vuejs實現
// html視圖:


// js邏輯:
var app = new Vue({
    el: "#app",
    data: {
        ArabNum: 0,
        ChineseNum: "",
        //ChineseSymbole: ["零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖"],
        ChineseSymbole: ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"],
        ChineseSection: ["", "萬", "億", "萬億"],
        //ChineseUnit: ["", "拾", "佰", "仟"],
        ChineseUnit: ["", "十", "百", "千"],
        ChineseUnitArab: {
            "零": 0,
            "一": 1,
            "二": 2,
            "三": 3,
            "四": 4,
            "五": 5,
            "六": 6,
            "七": 7,
            "八": 8,
            "九": 9,
            "十": 10,
            "百": 100,
            "千": 1000,
            "萬": 10000,
            "億": 100000000,
            "萬億": 1000000000000,
        }
    },
    // 區別主要在這里:
    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中,只要分別設計read和write函數即可實現雙向綁定。read用于model到view的轉換,write用于view到model的轉換。

Angularjs實現

相比于Vuejs,如果在ng-model中直接使用filter,會報錯:


// error:
Expression "ArabNum|thousandth" is non-assignable

為了實現和Vuejs類似的邏輯,我首先google了一下,發現只能通過directive實現:

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的語法要麻煩很多。而且$formatters只有在內部的model被改變時,才會對view生效。比如input改變時,$parsers先調用(V-->M),返回值直接給了ngModel,但是$formatters不會調用,即M-->V不會被調用,否則 M修改V,V又修改M,就是死循環了。

只有你通過程序修改了ArabNum后,$formatters才會調用(M-->V)。所以,必須通過jquery的方式,在blur函數中,對element的value進行直接修改,才能實現上述Vue的效果。

總結

只要仔細一點,耐心一點,兩個數字表示方式的轉換還是比較容易實現的。

通過對比Vue和angular可以看到,Vue確實比Ng要方便些。這只是其中的一個方面。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/54357.html

相關文章

  • JavaScript拉伯數字與中文數字互相轉換

    摘要:然后我立馬丟了一個以前我寫的一個轉中文數字的過濾器代碼小寫數字轉換成大寫只處理到零一二三四五六七八九十百千萬億十十零接下來就有人回應你這種寫法要命了才就這么長,如果呢然后我以項目當時需求就只到位為由回應。 有一次在上海前端交流群看見有人在群里發了一個求助信息: 請用JavaScript語言編寫一個函數,要求入口參數為數字, 取值范圍是一位數整數,返回值是字符串,該函數的功能為:返回該數...

    用戶84 評論0 收藏0
  • Python: 熟悉又陌生的字符編碼

    摘要:常見的字符編碼有編碼,編碼,編碼等。碼只規定了個字符的編碼,這在美國是夠用的。小結是一種針對的可變長度字符編碼,它是的實現方式之一。 字符編碼是計算機編程中不可回避的問題,不管你用 Python2 還是 Python3,亦或是 C++, Java 等,我都覺得非常有必要厘清計算機中的字符編碼概念。本文主要分以下幾個部分介紹: 基本概念 常見字符編碼簡介 Python 的默認編碼 Py...

    Vultr 評論0 收藏0
  • 【Python3】基本數據類型-字符串(str)

    摘要:字符串常用功能移除空白分割長度索引切片下面來詳細介紹下字符串首字母大寫將所有大寫變小寫支持多種國家語言將大寫變成小寫只支持英文文本居中參數表示總長度參數空白處填充的字符長度為左右填充,包含自身長度表示傳入之在字符串中出現的次數參數要查找的值 字符串常用功能: 移除空白 分割 長度 索引 切片 下面來詳細介紹下 ~ capitalize 字符串首字母大寫 name = xmzncc ...

    Awbeci 評論0 收藏0
  • [零基礎學Python]坑爹的字符編碼

    摘要:所以,哪怕是初學者,都要了解并能夠解決字符編碼問題。在這個世界上,有好多不同的字符編碼。目前最新的版本為,已收入超過十萬個字符第十萬個字符在年獲采納。涵蓋的數據除了視覺上的字形編碼方法標準的字符編碼外,還包含了字符特性,如大小寫字母。 字符編碼,在編程中,是一個讓學習者比較郁悶的東西,比如一個str,如果都是英文,好說多了。但恰恰不是如此,中文是我們不得不用的。所以,哪怕是初學者,都要...

    rozbo 評論0 收藏0

發表評論

0條評論

王軍

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<