`
水卢(waterloo)
  • 浏览: 32810 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用Lotus Forms的FCI功能实现一个数字货币到中文货币的转换

阅读更多
FCI是Lotus Forms提供的一种扩展机制,通过这种机制能够扩展Forms Viewer和Forms Server的能力。

前一段时间有个合作伙伴问我Lotus Forms能不能支持将数字货币例如¥12,344,325.00自动转换成壹仟贰佰叁拾肆万肆仟叁佰贰拾伍圆整。这两天抽时间采用FCI写了一个例子,发布出来给大家参考。其中转换的算法不要问我,我也是从网上找的。

package com.ibm.eform;

import com.PureEdge.error.UWIException;
import com.PureEdge.ifx.Extension;
import com.PureEdge.ifx.ExtensionImplBase;
import com.PureEdge.ifx.IFX;

public class FCIExtension extends ExtensionImplBase implements Extension {

	public void extensionInit(IFX ifxMan) throws UWIException {
		new MoneyConvertorFunctionCall(ifxMan);
	}

}


package com.ibm.eform;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.PureEdge.IFSSingleton;
import com.PureEdge.IFSUserDataHolder;
import com.PureEdge.ShortHolder;
import com.PureEdge.ShortListHolder;
import com.PureEdge.StringHolder;
import com.PureEdge.StringListHolder;
import com.PureEdge.error.UWIException;
import com.PureEdge.ifx.IFX;
import com.PureEdge.xfdl.FormNodeP;
import com.PureEdge.xfdl.FunctionCall;
import com.PureEdge.xfdl.FunctionCallImplBase;
import com.PureEdge.xfdl.FunctionCallManager;


public class MoneyConvertorFunctionCall extends FunctionCallImplBase implements FunctionCall
{

	private final String[] strArray1 = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};  
    private final String[][] strArray2 = {{"仟","佰","拾","亿"},{"仟","佰","拾","万"},{"仟","佰","拾","圆"}};  
    private final String[] strArray3 = {"角","分"};  
    
    public static final int CONVERTMONEY = 1000;
	/**
	 * @param args
	 */

	public MoneyConvertorFunctionCall(IFX ifxMan) throws UWIException
	{
		FunctionCallManager	theFCM;

		if ((theFCM = IFSSingleton.getFunctionCallManager()) == null)
			throw new UWIException("Needed Function Call Manager");

		ifxMan.registerInterface(this,
			FunctionCall.FUNCTIONCALL_INTERFACE_NAME,
			FunctionCall.FUNCTIONCALL_CURRENT_VERSION,
			FunctionCall.FUNCTIONCALL_MIN_VERSION_SUPPORTED,
			0x01000301, 0, null, theFCM.getDefaultListener( ));

		theFCM.registerFunctionCall(this, "convert_package",
			"convertMoney", MoneyConvertorFunctionCall.CONVERTMONEY,
			FunctionCall.FCI_FOLLOWS_STRICT_CALLING_PARAMETERS,
			"S", 0x01000301, "Converts a money to Chinese style");
	}
    
	private String preProcessString(String str)  
    {  
//		str = NumberFormat.getCurrencyInstance().format(Double.valueOf(str)).toString();
		Pattern pattern = Pattern.compile(",|¥");
		Matcher mat = pattern.matcher(str); 
		return mat.replaceAll("");
    }  
	
	private String renderCurrency(String str)  
	{  
		str = this.preProcessString(str);  
		System.out.println(str);      
//		return String.valueOf(str.indexOf("."));
		if(str.indexOf(".") != -1)
		{
			String str2 = str.substring(0,str.indexOf("."));     //Integer part of str  
			String str3 = str.substring(str.indexOf(".")+1,str.length());   //Decimal part of str  
			
			StringBuffer buffer = new StringBuffer(100);     //Stringbuffer contains currency string  
			processIntegerPart(str2, buffer);  
			processDecimalPart(str3, buffer);  
			return (buffer.toString());  
		}
		return "";
	  }

	private void processIntegerPart(String str2, StringBuffer buffer) {
		int sectionnumb = getStringSectionNumber(str2); 
		for(int i=0;i<sectionnumb;i++){  
			String tmp = getIntegerSubPart(str2, sectionnumb, i);  
			if(Integer.parseInt(tmp) == 0){  
				if(i == (sectionnumb - 1)){  
					if(buffer.charAt(buffer.length() - 1) == '零')  
						buffer.deleteCharAt(buffer.length() - 1);  
					buffer.append('圆');  
					continue;  
				}  
				else{  
					if(buffer.charAt(buffer.length() - 1) == '零')  
						buffer.deleteCharAt(buffer.length() - 1);  
					else  
						buffer.append(strArray1[0]);  
					continue;  
				}     
			}
			
			int intTmp = 0; 
			for(int j=0;j<tmp.length();j++){  
				char c = tmp.charAt(j);  
				if(j == 0){  
					if(c == '0'){  
						if(i>0&&buffer.charAt(buffer.length()-1) == '零')  
							continue;  
						else  
							buffer.append(strArray1[0]);  
					}  
					else{  
						intTmp = Integer.parseInt(""+c);  
						buffer.append(strArray1[intTmp]).append(strArray2[3-sectionnumb+i][4-tmp.length()+j]);  
					}  
				}  
				else if(j!=0&&j<tmp.length()-1){  
					if(c=='0'){  
						if(tmp.charAt(j-1)=='0')  
							continue;  
						else  
							buffer.append(strArray1[0]);  
					}  
					else{  
						intTmp = Integer.parseInt(""+c);  
						buffer.append(strArray1[intTmp]).append(strArray2[3-sectionnumb+i][4-tmp.length()+j]);  
					}  
				}  
				else{  
					if(c=='0'){  
						if(tmp.charAt(j-1)=='0'){  
							buffer.deleteCharAt(buffer.length()-1);  
							buffer.append(strArray2[3-sectionnumb+i][4-tmp.length()+j]);  
						}  
						else  
							buffer.append(strArray2[3-sectionnumb+i][4-tmp.length()+j]);  
					}  
					else{  
						intTmp = Integer.parseInt(""+c);  
						buffer.append(strArray1[intTmp]).append(strArray2[3-sectionnumb+i][4-tmp.length()+j]);  
					}  
				}  
			}  
	}
	}

	private String getIntegerSubPart(String str2, int sectionnumb, int i) {
		String tmp = "";
		if(i == 0)  
			tmp = str2.substring(0,str2.length() - (sectionnumb - 1)*4);  
		else if(sectionnumb > 0)  
			tmp = str2.substring(str2.length()-(sectionnumb-i)*4,str2.length()-(sectionnumb-i-1)*4);
		return tmp;
	}

	private void processDecimalPart(String str3, StringBuffer buffer) {
		if("00".equals(str3))
			buffer.append("整");
		else
			for(int i=0;i<2;i++){  
				char c = str3.charAt(i)   ;  
				int intTmp = Integer.parseInt(""+c);  
				buffer.append(strArray1[intTmp]).append(strArray3[i]);  
			}
	}

	private int getStringSectionNumber(String str2) {
		int intTmp = str2.length()%4;  
		int k = 0;       //k:   parts   of   str   which   divided   by   4  
		if(intTmp == 0)  
			k = str2.length()/4;  
		else  
			k = (int)(str2.length()/4+1);
		return k;
	}

	public void evaluate(String arg0, String arg1, int theFunctionID, int arg3,
			short theCommand, FormNodeP arg5, FormNodeP arg6, IFSUserDataHolder arg7,
			IFSUserDataHolder arg8, FormNodeP[] theArgList, FormNodeP theResult)
			throws UWIException {
		String result = renderCurrency(theArgList[0].getLiteralEx(null));
		theResult.setLiteralEx(null, result);
	}

	public void help(String arg0, String arg1, int arg2,
			IFSUserDataHolder arg3, StringHolder arg4, StringHolder arg5,
			StringHolder arg6, StringListHolder arg7, StringListHolder arg8,
			ShortListHolder arg9, StringHolder arg10, ShortHolder arg11)
			throws UWIException {
		// TODO Auto-generated method stub
		
	}	
}


Manifest-Version: 1.0

Name: com/ibm/eform/FCIExtension.class
IFS-Extension: True



需要注意的是这个代码需要使用jdk 1.4编译,编译完成后打包为jar包,使用MANIFEST.MF进行描述。

打包完成后可以将jar包拷贝到viewer安装目录下的extension目录下,或者直接通过jar附件的方式附加在表单中。

几点需要注意的:
1.MANIFEST.MF文件每行的冒号后需要有一个空格
2.MANIFEST.MF文件最后一行下应该有一个空行
3.
theFCM.registerFunctionCall(this, "convert_package",
			"convertMoney", MoneyConvertorFunctionCall.CONVERTMONEY,
			FunctionCall.FCI_FOLLOWS_STRICT_CALLING_PARAMETERS,
			"S", 0x01000301, "Converts a money to Chinese style");


convert_package命名需要注意有一个下横线
分享到:
评论

相关推荐

    FCI2580 drivers

    在本文中,我们将深入探讨FCI2580驱动的相关知识点,包括其功能、工作原理以及如何安装和使用。 1. **DVB-T调谐器**:DVB-T是Digital Video Broadcasting - Terrestrial的缩写,是一种用于地面数字电视广播的标准。...

    DMA_FCI_sanggfo_MATLAB中dma_FCI_worldb5w_DFM/DMA中文_

    在本项目中,“DMA_FCI_sanggfo_MATLAB中dma_FCI_worldb5w_DFM/DMA中文”是一个使用MATLAB实现的DMA方法来估计FCI的案例。 首先,了解DMA(Data-Driven Method for Analysis)的基本概念。DMA是一种基于数据的分析...

    FCI流量计幻灯培训中文演示.rar

    "FCI流量计幻灯培训中文演示.rar" 文件提供了一个全面了解和学习FCI流量计的培训材料,尤其适合工程师、技术人员以及对流量测量感兴趣的人员。 幻灯片演示可能包含以下几个关键知识点: 1. **FCI流量计的工作原理*...

    压缩小工具 c++ fci.lib fdi.lib

    标题中的“压缩小工具 c++ fci.lib fdi.lib”指的是一个基于C++编程语言开发的压缩软件,其中利用了fci.lib和fdi.lib这两个库。这两个库是Microsoft的 Cabinet (CAB) 文件格式的接口库,常用于文件的压缩和解压缩...

    FCI CPCI 选型介绍

    FCI CPCI选型介绍的知识点涵盖了一个专门为电信行业设计的2mm硬度度量(2.00mm pitch)的模块化板对板或电缆对板连接系统,称为Millipacs®。它遵循IEC917和IEC61076-4-101标准,是市场上最受欢迎的背板连接器系统之一...

    FCI测试题整理.pdf

    1. 第一个问题涉及到自由落体运动,由等时性原则可知,两球同时落地,答案是(C)。 2. 第二个问题是关于牛顿第三定律,即作用力与反作用力的原理。正确答案是(E),两车之间的相互作用力大小相等,方向相反。 3. 第...

    FCI型简化细水口模架.zip

    FCI,全称为Family Core Insert,是指将多个成型部件的核心部分整合在一个公共芯块上,这样可以减少模具的组件数量,简化模具结构,提高模具的制造效率和使用寿命。 FCI型简化细水口模架的特点主要包括: 1. 结构...

    热扩散技术 ---- FCI产品的工作原理.rar

    这些金属源在高温下与硅基底接触,其原子会逐渐渗透到硅片的表面或近表面层,形成一个金属硅化物层。这个金属硅化物层具有良好的电导率,可以作为芯片间的电接触点,实现低电阻、高可靠性的连接。 热扩散工艺通常...

    利用FCI-FDI库进行CAB文件压缩

    FDI库提供了一个接口,使得开发者可以方便地将CAB文件中的文件解压缩到目标位置,同时支持验证数字签名以确保文件的完整性和安全性。这在安装程序或系统更新过程中非常有用,因为它能确保用户接收到未被篡改的软件。...

    Fci.rar_源码

    标题"Fci.rar_源码"暗示我们关注的焦点是一个名为"Fci"的源代码文件集合,它被压缩在RAR格式的归档文件中。RAR是一种常见的文件压缩格式,用于存储和传输多个文件,通常用于软件开发,因为它允许开发者将所有相关的...

    ANSI-FCI 70-2-2006 EN.pdf

    美国流体控制学会的控制阀阀座泄漏标注,这个标准,也就是以前所知道的ASME 816.104。美国流体控制学会需要定期地复审和更新这个标准。

    FCI端子台.pdf

    FCI印刷电路板的信号和电源接线盒可提供插入式和固定式配置,具有不同孔距大小和电线尺寸,为信号和电源提供解决方案。久经验证的突出笼式弹簧技术确保连接器耐用可靠,尤其满足工业、仪表和通讯领域日益增长的需求...

    TVP_FAVAR.zip_FA-VAR_TVP_FAVAR_tvp-favar_var_宏观

    TVP_FAVAR.zip文件包含的是FA-VAR(Factor Augmented Vector Autoregression)模型,它是一种在宏观经济研究中广泛使用的统计工具,特别适用于分析复杂的经济系统和多变量时间序列数据。FA-VAR模型将传统的VAR...

    使用微软的FCI/FDI库进行文件压缩VC源代码

    " CAB22"可能表示压缩包中的一个或多个文件,这可能是实现的示例代码、测试数据或其他相关资源。通过查看和分析这些文件,开发者可以更好地理解FCI/FDI库的使用方法,并将其应用到自己的项目中。 总的来说,这份源...

    FCI板卡边缘连接器.pdf

    FCI板卡边缘连接器是一种专门用于电力分配和电源控制的连接器系统,设计用于在电子设备中实现坚固且可靠的连接。这些连接器通常应用于服务器、存储设备以及电信设备的板对板连接,以提供到嵌入式交流/直流电源的稳定...

    FCI 29针直角插座可实现串行硬盘连接

    FCI公司的29针直角插座连接器是针对串行硬盘连接设计的一种创新性解决方案,尤其适用于数据、通信以及工业设备领域。这款连接器的主要特点和功能包括以下几个方面: 1. **接口类型与针脚数量**:该连接器拥有29个...

    fci-breeds:FCI认可的犬种清单

    在压缩包子文件的文件名称列表 "fci-breeds-main" 中,我们看到只有一个主要的文件或目录名,这可能是一个包含所有犬种信息的主文件或一个包含子文件夹的结构,每个子文件夹代表一个犬种或一组犬种。 基于以上信息...

    智能能量采集和低功耗故障指示器设计.pdf

    智能能量采集和低功耗故障指示器设计是一个涉及多个领域的技术方案,旨在开发出能够实现低至微安级功耗的故障指示器(FCI)系统。故障指示器系统在输配电系统中扮演着重要的角色,它能够快速地监测和响应配电网中的...

    宏观经济数据(GDP、FCI)季度性、分位数统计 宏观经济数据(GDP、FCI)季度性、分位数统计

    宏观经济数据(GDP、FCI)季度性、分位数统计 宏观经济数据(GDP、FCI)季度性、分位数统计 宏观经济数据(GDP、FCI)季度性、分位数统计 宏观经济数据(GDP、FCI)季度性、分位数统计 宏观经济数据(GDP、FCI)季度...

    FCI开发出为薄型PCI Express板设计的卡沿接插器

    为了解决这一问题,FCI公司开发出了一种按压配合垂直PCI Express卡沿接插器。这款新型接插器专为2.36mm到4.19mm厚度的PCB设计,通过按压配合的方式,有效避免了在厚PCB上布置I/O插槽时可能出现的焊接问题,从而保障...

Global site tag (gtag.js) - Google Analytics