zoukankan      html  css  js  c++  java
  • 数字转换成中文大写,英文大写

    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

  • 相关阅读:
    NOI2015刷题记录
    [WC2013][UOJ58]糖果公园 莫队算法
    啦啦啦~
    完全平方数
    构建之法
    测试更新
    程序的测试
    程序的封装
    构建之法5.5-6-7章观后感
    给徐侃童鞋的一个汉堡
  • 原文地址:https://www.cnblogs.com/gzh4455/p/2488169.html
Copyright © 2011-2022 走看看