Infopath2010 实现大写金额的方法
Infopath2010自带的函数中无大写金额的转换,只能通过编程方式来实现,步骤如下:
1、先插入两个Textbox,如图所示:
2、点击开发工具,语言C#
3、打开代码编辑器
4、全部代码如下:
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、最终效果: