數字轉換成中文大寫,英文大寫


Javascript做法

代碼演練如下:

可以實現轉換為中文大寫,及英文大寫

View Code
<script src="JS/DecodeNo.js" type="text/javascript"></script>
    <script type="text/javascript">
        function TransCn() {
            document.getElementById("out").value = ToCn(document.getElementById("Num").value);
        }
        function TransEn() {
            document.getElementById("out").value = ToEn(document.getElementById("Num").value));
        }
    </script>
    <script type="text/javascript">
        function AlertMessage() {
            alert(document.getElementById("Num").value);
        }
    </script>
</head>
<body>
    <form action="" method="get" name="mainForm">
    <input type="text" name="Num" value="" id="Num" />
    <div>
        <input type="button" name="Eng" value="轉換成英文 " onclick="TransEn()" />&nbsp;
        <input type="button" name="Chinese" value="轉換成中文 " onclick="TransCn()" />
    </div>
    <textarea name="out" cols="90" rows="5" id="out"></textarea>
    <input type="button" name="alertMessage" value="Alert Message " onclick="AlertMessage();" />
    </form>
</body>

 

DecodeNo.js代碼如下

View Code
function ToCn(a) {
    var b = 9.999999999999E10,
    f = "",
    h = "",
    g = "",
    e = "",
    k = "",
    p = "",
    q = "",
    r = "",
    s = "",
    t = "",
    l = "",
    d = "",
    i = "",
    m = "",
    j = "",
    u = "",
    o = "",
    c = "",
    n = "",
    v = "";
    
    if (a == "") {
        alert("請輸入數字!");
        return ""
    }
    if (a.match(/[^,.\d]/) != null) {
        alert("請不要輸入其他字符!");
        return ""
    }
    if (a.match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/) ==
    null) {
        alert("非法格式!");
        return ""
    }
    a = a.replace(/,/g, "");
    a = a.replace(/^0+/, "");
    if (Number(a) > b) {
        alert("對不起,你輸入的數字太大了!最大數字為99999999999.99!");
        return ""
    }
    b = a.split(".");
    if (b.length > 1) {
        a = b[0];
        b = b[1];
        b = b.substr(0, 2)
    } else {
        a = b[0];
        b = ""
    }
    h = new Array(f, h, g, e, k, p, q, r, s, t);
    l = new Array("", l, d, i);
    m = new Array("", m, j);
    n = new Array(c, n);
    c = "";
    if (Number(a) > 0) {
        for (d = j = 0; d < a.length; d++) {
            e = a.length - d - 1;
            i = a.substr(d,
            1);
            g = e / 4;
            e = e % 4;
            if (i == "0") j++;
            else {
                if (j > 0) c += h[0];
                j = 0;
                c += h[Number(i)] + l[e]
            }
            if (e == 0 && j < 4) c += m[g]
        }
        c += o
    }
    if (b != "") for (d = 0; d < b.length; d++) {
        i = b.substr(d, 1);
        if (i != "0") c += h[Number(i)] + n[d]
    }
    if (c == "") c = f + o;
    if (b.length < 2) c += v;
    return c = u + c
}
var arr1 = new Array("", " thousand", " million", " billion"),
arr2 = new Array("zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"),
arr3 = new Array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"),
arr4 = new Array("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen");
function ToEn(a) {
    var b = a.length,
    f,
    h = 0,
    g = "",
    e = Math.ceil(b / 3),
    k = b - e * 3;
    g = "";
    for (f = k; f < b; f += 3) {++h;
        num3 = f >= 0 ? a.substring(f, f + 3) : a.substring(0, k + 3);
        strEng = English(num3);
        if (strEng != "") {
            if (g != "") g += ",";
            g += English(num3) + arr1[e - h]
        }
    }
    return g
}
function English(a) {
    strRet = "";
    if (a.length == 3 && a.substr(0, 3) != "000") {
        if (a.substr(0, 1) != "0") {
            strRet += arr3[a.substr(0, 1)] + " hundred";
            if (a.substr(1, 2) != "00") strRet += " and "
        }
        a = a.substring(1)
    }
    if (a.length == 2) if (a.substr(0, 1) == "0") a = a.substring(1);
    else if (a.substr(0, 1) == "1") strRet += arr4[a.substr(1, 2)];
    else {
        strRet += arr2[a.substr(0, 1)];
        if (a.substr(1, 1) != "0") strRet += "-";
        a = a.substring(1)
    }
    if (a.length == 1 && a.substr(0, 1) != "0") strRet += arr3[a.substr(0, 1)];
    return strRet
};
function copy(a) {
    if (a = findObj(a)) {
        a.select();
        js = a.createTextRange();
        js.execCommand("Copy")
    }
}
function findObj(a, b) {
    var c,
    d;
    b || (b = document);
    if ((c = a.indexOf("?")) > 0 && parent.frames.length) {
        b = parent.frames[a.substring(c + 1)].document;
        a = a.substring(0, c)
    }
    if (! (d = b[a]) && b.all) d = b.all[a];
    for (c = 0; ! d && c < b.forms.length; c++) d = b.forms[c][a];
    for (c = 0; ! d && b.layers && c < b.layers.length; c++) d = findObj(a, b.layers[c].document);
    if (!d && document.getElementById) d = document.getElementById(a);
    return d
}

也可以點擊鏈接下載  Download

 

 

Asp.Net 做法

Money 類的代碼如下,只實現轉換為中文大寫

View Code
 public class Money
    {
        /// <summary>
        /// 把數字轉換成中文大寫(不帶整)
        /// </summary>
        /// <param name="money">數字.ToString()</param>
        /// <returns></returns>
        public string ConvertToChinese2(string money)
        {
            //將小寫金額轉換成大寫金額   
            double MyNumber = Convert.ToDouble(money);
            String[] MyScale = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" };
            String[] MyBase = { "", "", "", "", "", "", "", "", "", "" };
            String M = "";
            bool isPoint = false;
            if (money.IndexOf(".") != -1)
            {
                money = money.Remove(money.IndexOf("."), 1);
                isPoint = true;
            }
            for (int i = money.Length; i > 0; i--)
            {
                int MyData = Convert.ToInt16(money[money.Length - i].ToString());
                M += MyBase[MyData];
                if (isPoint == true)
                {
                    M += MyScale[i - 1];
                }
                else
                {
                    M += MyScale[i + 1];
                }
            }
            return M;
        }


        /// <summary>
        /// 數位
        /// </summary>
        public enum NumLevel { Cent, Chiao, Yuan, Ten, Hundred, Thousand, TenThousand, hundredMillon, Trillion };

        /// <summary>
        /// 數位的指數
        /// </summary>
        private int[] NumLevelExponent = new int[] { -2, -1, 0, 1, 2, 3, 4, 8, 12 };

        /// <summary>
        /// 數位的中文字符
        /// </summary>
        private string[] NumLeverChineseSign = new string[] { "", "", "", "", "", "", "", "", "" };

        /// <summary>
        /// 大寫字符
        /// </summary>
        private string[] NumChineseCharacter = new string[] { "", "", "", "", "", "", "", "", "", "" };


        /// <summary>
        /// 整(當沒有 角分 時)
        /// </summary>

        private const string EndOfInt = "";

        private bool IsValidated<T>(T Num)
        {
            Regex reg = new Regex(@"^(([0])|([1-9]\d{0,23}))(\.\d{1,2})?$");
            if (reg.IsMatch(Num.ToString()))
            {
                return true;

            }
            return false;
        }

        /// <summary>
        /// 獲取數字的數位 使用log
        /// </summary>
        /// <param name="Num"></param>
        /// <returns></returns>
        private NumLevel GetNumLevel(double Num)
        {
            double numLevelLength;
            NumLevel NLvl = new NumLevel();
            if (Num > 0)
            {
                numLevelLength = Math.Floor(Math.Log10(Num));
                for (int i = NumLevelExponent.Length - 1; i >= 0; i--)
                {
                    if (numLevelLength >= NumLevelExponent[i])
                    {
                        NLvl = (NumLevel)i;
                        break;
                    }
                }
            }
            else
            {
                NLvl = NumLevel.Yuan;
            }
            return NLvl;

        }

        /// <summary>
        /// 是否跳位
        /// </summary>
        /// <returns></returns>
        private bool IsDumpLevel(double Num)
        {
            if (Num > 0)
            {
                NumLevel? currentLevel = GetNumLevel(Num);
                NumLevel? nextLevel = null;
                int numExponent = this.NumLevelExponent[(int)currentLevel];

                double postfixNun = Math.Round(Num % (Math.Pow(10, numExponent)), 2);
                if (postfixNun > 0)
                    nextLevel = GetNumLevel(postfixNun);
                if (currentLevel != null && nextLevel != null)
                {
                    if (currentLevel > nextLevel + 1)
                    {
                        return true;
                    }
                }
            }
            return false;

        }

        /// <summary>
        /// 是否大於兆,如果大於就把字符串分為兩部分,
        /// 一部分是兆以前的數字
        /// 另一部分是兆以后的數字
        /// </summary>
        /// <param name="Num"></param>
        /// <returns></returns>
        private bool IsBigThanTillion(string Num)
        {
            bool isBig = false;
            if (Num.IndexOf('.') != -1)
            {
                //如果大於兆
                if (Num.IndexOf('.') > NumLevelExponent[(int)NumLevel.Trillion])
                {
                    isBig = true;
                }
            }
            else
            {
                //如果大於兆
                if (Num.Length > NumLevelExponent[(int)NumLevel.Trillion])
                {
                    isBig = true;
                }
            }
            return isBig;
        }

        /// <summary>
        /// 把數字字符串由‘兆’分開兩個
        /// </summary>
        /// <returns></returns>
        private double[] SplitNum(string Num)
        {
            //兆的開始位
            double[] TillionLevelNums = new double[2];
            int trillionLevelLength;
            if (Num.IndexOf('.') == -1)
                trillionLevelLength = Num.Length - NumLevelExponent[(int)NumLevel.Trillion];
            else
                trillionLevelLength = Num.IndexOf('.') - NumLevelExponent[(int)NumLevel.Trillion];
            //兆以上的數字
            //TillionLevelNums[0] = Convert.ToDouble(Num.Substring(0, trillionLevelLength));
            ////兆以下的數字
            //TillionLevelNums[1] = Convert.ToDouble(Num.Substring(trillionLevelLength ));
            return TillionLevelNums;
        }

        private string ContactNumChinese(double[] tillionNums)
        {
            string uptillionStr = CalculateChineseSign(tillionNums[0], NumLevel.Trillion, true, IsStartOfTen(tillionNums[0]));
            string downtrillionStr = CalculateChineseSign(tillionNums[1], null, true, false);
            string chineseCharactor = string.Empty;
            //分開后的字符是否有跳位
            if (GetNumLevel(tillionNums[1] * 10) == NumLevel.Trillion)
            {
                chineseCharactor = uptillionStr + NumLeverChineseSign[(int)NumLevel.Trillion] + downtrillionStr;
            }
            else
            {
                chineseCharactor = uptillionStr + NumLeverChineseSign[(int)NumLevel.Trillion];
                if (downtrillionStr != "零元整")
                {
                    chineseCharactor += NumChineseCharacter[0] + downtrillionStr;
                }
                else
                {
                    chineseCharactor += "元整";
                }
            }
            return chineseCharactor;

        }

        /// <summary>
        /// 計算中文字符串
        /// </summary>
        /// <param name="Num">數字</param>
        /// <param name="NL">數位級別 比如1000萬的 數位級別為萬</param>
        /// <param name="IsExceptTen">是否以‘壹拾’開頭</param>
        /// <returns>中文大寫</returns>
        private string CalculateChineseSign(double Num, NumLevel? NL, bool IsDump, bool IsExceptTen)
        {
            Num = Math.Round(Num, 2);
            bool isDump = false;
            //Num的數位
            NumLevel? currentLevel = GetNumLevel(Num);
            int numExponent = this.NumLevelExponent[(int)currentLevel];

            string Result = string.Empty;

            //整除后的結果
            int prefixNum;
            //余數 當為小數的時候 分子分母各乘100
            double postfixNun;
            if (Num >= 1)
            {
                prefixNum = Convert.ToInt32(Math.Floor(Num / Math.Pow(10, numExponent)));
                postfixNun = Math.Round(Num % (Math.Pow(10, numExponent)), 2);
            }
            else
            {
                prefixNum = Convert.ToInt32(Math.Floor(Num * 100 / Math.Pow(10, numExponent + 2)));
                postfixNun = Math.Round(Num * 100 % (Math.Pow(10, numExponent + 2)), 2);
                postfixNun *= 0.01;
            }

            if (prefixNum < 10)
            {
                //避免以‘壹拾’開頭
                if (!(NumChineseCharacter[(int)prefixNum] == NumChineseCharacter[1]
                && currentLevel == NumLevel.Ten && IsExceptTen))
                {
                    Result += NumChineseCharacter[(int)prefixNum];
                }
                else
                {
                    IsExceptTen = false;
                }
                //加上單位
                if (currentLevel == NumLevel.Yuan)
                {
                    ////當為 “元” 位不為零時 加“元”。
                    if (NL == null)
                    {
                        Result += NumLeverChineseSign[(int)currentLevel];
                        //當小數點后為零時 加 "整"
                        if (postfixNun == 0)
                        {
                            Result += EndOfInt;
                        }
                    }
                }
                else
                {
                    Result += NumLeverChineseSign[(int)currentLevel];
                }
                //當真正的個位為零時 加上“元”
                if (NL == null && postfixNun < 1 && currentLevel > NumLevel.Yuan && postfixNun > 0)
                {
                    Result += NumLeverChineseSign[(int)NumLevel.Yuan];

                }
            }
            else
            {
                //當 前綴數字未被除盡時, 遞歸下去
                NumLevel? NextNL = null;
                if ((int)currentLevel >= (int)(NumLevel.TenThousand))
                    NextNL = currentLevel;

                Result += CalculateChineseSign((double)prefixNum, NextNL, isDump, IsExceptTen);
                if ((int)currentLevel >= (int)(NumLevel.TenThousand))
                {
                    Result += NumLeverChineseSign[(int)currentLevel];
                }
            }
            //是否跳位
            // 判斷是否加零, 比如302 就要給三百 后面加零,變為 三百零二。
            if (IsDumpLevel(Num))
            {
                Result += NumChineseCharacter[0];
                isDump = true;

            }

            //余數是否需要遞歸
            if (postfixNun > 0)
            {
                Result += CalculateChineseSign(postfixNun, NL, isDump, false);
            }
            else if (postfixNun == 0 && currentLevel > NumLevel.Yuan)
            {
                //當數字是以零元結尾的加上 元整 比如1000000一百萬元整
                if (NL == null)
                {
                    Result += NumLeverChineseSign[(int)NumLevel.Yuan];
                    Result += EndOfInt;
                }
            }

            return Result;
        }


        /// <summary>
        /// 把數字轉換成中文(整數帶 "元整" )
        /// </summary>
        /// <param name="Num"></param>
        /// <returns></returns>
        public string ConvertToChinese(string Num)
        {
            //if (!IsValidated<string>(Num))
            //{
            //    throw new OverflowException("數值格式不正確,請輸入小於9999億兆的數字且最多精確的分的金額!");
            //}
            string chineseCharactor = string.Empty;
            if (IsBigThanTillion(Num))
            {
                double[] tillionNums = SplitNum(Num);
                chineseCharactor = ContactNumChinese(tillionNums);
            }
            else
            {
                double dNum = Convert.ToDouble(Num);
                chineseCharactor = CalculateChineseSign(dNum, null, true, IsStartOfTen(dNum));
            }
            return chineseCharactor;
        }

        /// <summary>
        /// 是否以“壹拾”開頭,如果是就可以把它變為“拾”
        /// </summary>
        /// <param name="Num"></param>
        /// <returns></returns>
        private bool IsStartOfTen(double Num)
        {
            bool isStartOfTen = false;
            while (Num >= 10)
            {
                if (Num == 10)
                {
                    isStartOfTen = true;
                    break;
                }
                NumLevel currentLevel = GetNumLevel(Num);

                int numExponent = this.NumLevelExponent[(int)currentLevel];
                Num = Convert.ToInt32(Math.Floor(Num / Math.Pow(10, numExponent)));
                if (currentLevel == NumLevel.Ten && Num == 1)
                {
                    isStartOfTen = true;
                    break;
                }
            }
            return isStartOfTen;

        }

    }


實例演示如下:

            Money mon = new Money();           
            Response.Write(mon.ConvertToChinese("0"));  //這是帶 “元整”,如果是整數
            Response.Write(mon.ConvertToChinese2("13224324.45"));  //不帶 元整

 

 

SharePoint應用

1. DLL需放到GAC里。

2. 后台:using G.SharePoint.Finance;
3. 前台需 引用

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="DLlTest_Default" %>
<%@ Assembly Name="G.SharePoint.Finance, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3e57457a2f49f463" %>
<%@ Import Namespace="G.SharePoint.Finance" %>

4. 后台

    Money m = new Money();
    leResult.Text=m.ConvertToChinese(this.txtNum.Text.Trim());

 G.SharePoint.Finance.DLL  Download

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM