• Infopath2010 实现大写金额的方法


    Infopath2010自带的函数中无大写金额的转换,只能通过编程方式来实现,步骤如下:

    1、先插入两个Textbox,如图所示:

    image

    2、点击开发工具,语言C#

    image

    3、打开代码编辑器

    image

    4、全部代码如下:

    image

    using Microsoft.Office.InfoPath;
    using System;
    using System.Xml;
    using System.Xml.XPath;
    
    
    namespace 金额转换
    {
        public partial class FormCode
        {
            // 启用浏览器功能的表单不支持成员变量。
            // 请使用代码从 FormState 词典
            // 写入和读取这些值,如下所示:
            //
            // private object _memberVariable
            // {
            //     get
            //     {
            //         return FormState["_memberVariable"];
            //     }
            //     set
            //     {
            //         FormState["_memberVariable"] = value;
            //     }
            // }
    
            // 注意: 以下是 Microsoft InfoPath 所需的过程。
            // 可以使用 Microsoft InfoPath 对其进行修改。
            public void InternalStartup()
            {
                EventManager.XmlEvents["/my:myFields/my:金额"].Changed += new XmlChangedEventHandler(金额_Changed);
            }
    
            public void 金额_Changed(object sender, XmlEventArgs e)
            {
                // 在此处编写代码,用于更改主数据源。
                if (e.Operation == XmlOperation.ValueChange)
                {
                    // 在此处编写代码,用于更改主数据源。
                    XPathNavigator AmountInFigures = this.CreateNavigator().SelectSingleNode("/my:myFields/my:金额", NamespaceManager);
                    XPathNavigator AmountINWords = this.CreateNavigator().SelectSingleNode("/my:myFields/my:大写金额", NamespaceManager);
    
                    if (AmountInFigures.Value != "")
                    {
                        double money = AmountInFigures.ValueAsDouble;
    
                        string moneystr = NumGetStr(money);
                        AmountINWords.SetValue(moneystr);
                    }
    
                }
            }
    
    
            //此四个变量需在更改成属性get set或直接写在函数中调中,本例是写在函数中调用
    
            //private static String[] Ls_ShZ ={ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾" };
    
            //private static String[] _Ls_DW_Zh ={ "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万" };
            //private static String[] Num_DW ={ "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万" };
            //private static String[] Ls_DW_X ={ "角", "分" };
    
            /// <summary>
            /// 金额小写转中文大写。
            /// 整数支持到万亿;小数部分支持到分(超过两位将进行Banker舍入法处理)
            /// </summary>
            /// <param name="Num">需要转换的双精度浮点数</param>
            /// <returns>转换后的字符串</returns>
            private static String Reversion_Str(String Rstr)
            {
                String[] Ls_ShZ ={ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾" };
                String[] Ls_DW_Zh ={ "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万" };
                String[] Num_DW ={ "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万" };
                String[] Ls_DW_X ={ "角", "分" };
                Char[] LS_Str = Rstr.ToCharArray();
                Array.Reverse(LS_Str);
                String ReturnSte = "";
                ReturnSte = new String(LS_Str);//反转字符串
                return ReturnSte;
            }
    
    
            public static String NumGetStr(Double Num)
            {
                String[] Ls_ShZ ={ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾" };
                String[] Ls_DW_Zh ={ "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万" };
                String[] Num_DW ={ "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万" };
                String[] Ls_DW_X ={ "角", "分" };
    
                Boolean iXSh_bool = false;//是否含有小数,默认没有(0则视为没有)
                Boolean iZhSh_bool = true;//是否含有整数,默认有(0则视为没有)
    
                string NumStr;//整个数字字符串
                string NumStr_Zh;//整数部分
                string NumSr_X = "";//小数部分
                string NumStr_DQ;//当前的数字字符
                string NumStr_R = "";//返回的字符串
    
                Num = Math.Round(Num, 2);//四舍五入取两位
    
                //各种非正常情况处理
                if (Num < 0)
                    return "不转换欠条";
                if (Num > 9999999999999.99)
                    return "很难想象谁会有这么多钱!";
                if (Num == 0)
                    return Ls_ShZ[0];
    
                //判断是否有整数
                if (Num < 1.00)
                    iZhSh_bool = false;
    
                NumStr = Num.ToString();
    
                NumStr_Zh = NumStr;//默认只有整数部分
                if (NumStr_Zh.Contains("."))
                {//分开整数与小数处理
                    NumStr_Zh = NumStr.Substring(0, NumStr.IndexOf("."));
                    NumSr_X = NumStr.Substring((NumStr.IndexOf(".") + 1), (NumStr.Length - NumStr.IndexOf(".") - 1));
                    iXSh_bool = true;
                }
    
    
                if (NumSr_X == "" || int.Parse(NumSr_X) <= 0)
                {//判断是否含有小数部分
                    iXSh_bool = false;
                }
    
                if (iZhSh_bool)
                {//整数部分处理
                    NumStr_Zh = Reversion_Str(NumStr_Zh);//反转字符串
    
                    for (int a = 0; a < NumStr_Zh.Length; a++)
                    {//整数部分转换
                        NumStr_DQ = NumStr_Zh.Substring(a, 1);
                        if (int.Parse(NumStr_DQ) != 0)
                            NumStr_R = Ls_ShZ[int.Parse(NumStr_DQ)] + Ls_DW_Zh[a] + NumStr_R;
                        else if (a == 0 || a == 4 || a == 8)
                        {
                            if (NumStr_Zh.Length > 8 && a == 4)
                                continue;
                            NumStr_R = Ls_DW_Zh[a] + NumStr_R;
                        }
                        else if (int.Parse(NumStr_Zh.Substring(a - 1, 1)) != 0)
                            NumStr_R = Ls_ShZ[int.Parse(NumStr_DQ)] + NumStr_R;
    
                    }
    
                    if (!iXSh_bool)
                        return NumStr_R + "整";
    
                    //NumStr_R += "零";
                }
    
                for (int b = 0; b < NumSr_X.Length; b++)
                {//小数部分转换
                    NumStr_DQ = NumSr_X.Substring(b, 1);
                    if (int.Parse(NumStr_DQ) != 0)
                        NumStr_R += Ls_ShZ[int.Parse(NumStr_DQ)] + Ls_DW_X[b];
                    else if (b != 1 && iZhSh_bool)
                        NumStr_R += Ls_ShZ[int.Parse(NumStr_DQ)];
                }
    
                return NumStr_R;
    
            }
    
    
        }
    
    
    }
    5、最终效果:
    image
  • 相关阅读:
    12个思维管理工具:标杆分析法、麦肯锡7步分析法、SMART原则....
    Capturing Audio in Android Q
    闭环思维
    如何下载Google Play商店的apk?如何安装分割的apk ?
    强制删除文件 或 文件夹
    ToDesk ---- 个人免费 极致流畅的远程协助软件
    无法显示内挂(非内嵌)字幕-
    MKVToolNix 一款Matroska(.mkv)格式编辑工具,可以将超过16条音轨/字幕封装到一个.mkv文件中去
    Symantec Endpoint Protection(赛门铁克杀毒软件) 如何添加白名单避免被误删、误杀?
    二维码识别工具
  • 原文地址:https://www.cnblogs.com/Bany/p/3044383.html
Copyright © 2020-2023  润新知