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

 

posted on 2012-05-07 18:39  gzh4455  阅读(4168)  评论(0编辑  收藏  举报