Kanas.Net:从一个外围类库开始

从今天开始我陆陆续续向大家介绍我的Kanas.Net框架。这是一个垂直框架,设计目标是在业务层完全不用关心数据访问层的任何问题,只需要访问实体类型相关的对象空间。之所以是“垂直”,是因为框架在某些地方跨越了业务层,业务层只需要为框架负责而不需要为表现层负责,由框架根据业务层的请求产生相关的表现层。Kanas.Net没有提供任何与SQL相关的支持,开发者甚至完全不需要了解数据库连接、命令、事务之类的任何细节,ADO.Net的所有细节在业务层完全被隐藏了。在业务层所接触的只是实体对象和形形色色的实体关系。

Chinese.Dll是Kanas.net框架的一个外围类库,解决一些.Net Framework未解决的本地化相关的基础性问题。这个应该是与框架无关的。
主要功能是:
一、人民币金额大写,符合相关的规范。
二、农历计算,本例采用查表法,只能处理1900~2050年共150年。笔者写过一个带农历的DatePicker就是用的这个类库。另外还有一个按标准历法精确计算(基于VSOP87算法)的版本,可以处理公元前9999~9999年的农历。但事实上并不实用,所以没有提供。
三、汉语拼音字头检索,在算法方面进行了一定的优化,对处理多音字效果很好。
用法参见以下说明。

Kanas.Supports.Chinese命名空间主要提供一些本地化支持的特别类型服务。这些类型在
Chinese.Dll
单元中。

Kanas.Supports.Chinese.Currency

金额类型。为值类型(继承自System.ValueType)

构造器:

构造完整的金额类型

Currency(double currency)

公共属性:

名称

类型

说明

Value

double

实际金额值

公共方法:

获取金额的中文大写金额串

string ToChineseCurrencyString()

返回值:返回符合有关机构对票据填写要求的中文大写金额串。

附:中国人民银行的有关规定:

 

正确填写票据和结算凭证的基本规定

 

银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。票据和结算凭证是银行、单位和个人凭以记载账务的会计凭证,是记载经济业务和明确经济责任的一种书面证明。因此,填写票据和结算凭证,必须做到标准化、规范化,要要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。

一、中文大写金额数字应用正楷或行书填写,如壹(壹)、贰(贰)、叁、肆(肆)、伍(伍)、陆(陆)、柒、捌、玖、拾、佰、仟、万(万)、亿、元、角、分、零、整(正)等字样。不得用一、二(两)、三、四、五、六、七、八、九、十、廿、毛、另(或0)填写,不得自造简化字。如果金额数字书写中使用繁体字,如的,也应受理。

二、中文大写金额数字到“元”为止的,在“元”之后,应写“整”(或“正”)字,在“角”之后可以不写“整”(或“正”)字。大写金额数字有“分”的,“分”后面不写“整”(或“正”)字。

三、中文大写金额数字前应标明“人民币”字样,大写金额数字应紧接“人民币”字样填写,不得留有空白。大写金额数字前未印“人民币”字样的,应加填“人民币”三字。在票据和结算凭证大写金额栏内不得预印固定的“仟、佰、拾、万、仟、伯、拾、元、角、分”字样。

四、阿拉伯小写金额数字中有“0”时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。举例如下:

(一)阿拉伯数字中间有“O”时,中文大写金额要写“零”字。如¥140950,应写成人民币壹仟肆佰零玖元伍角。

(二)阿拉伯数字中间连续有几个“0”时,中文大写金额中间可以只写一个“零”字。如¥6,007.14,应写成人民币陆仟零柒元壹角肆分。

(三)阿拉伯金额数字万位或元位是“0,或者数字中间连续有几个“0”,万位、元位也是“0,但千位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字。如¥1680.32,应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分;又如¥107,000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。

(四)阿拉伯金额数字角位是“0,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16,409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾伍元零肆分。

五、阿拉伯小写金额数字前面,均应填写入民币符号“¥”(或草写:)。阿拉伯小写金额数字要认真填写,不得连写分辨不清。

六、票据的出票日期必须使用中文大写。为防止变造票据的出禀日期,在填写月、日时,月为壹、贰和壹拾的,日为壹至玖和壹拾、贰拾和叁拾的,应在其前加“零”;日为抬壹至拾玖的,应在其前加“壹”。如115,应写成零壹月壹拾伍日。再如1020,应写成零壹拾月零贰拾日。

七、票据出票日期使用小写填写的,银行不予受理。大写日期未按要求规范填写的,银行可予受理,但由此造成损失的,由出票入自行承担。

 

本类型中的相关算法遵守以上基本规定,但尽可能短,即:可以不写“零”的地方一律不写“零”。此外,考虑到有可能“人民币”字样已印在纸样上,本类型返回的大写金额串结果中将不出现该字样。

获取指定原始值金额的中文大写金额串

static string ToChineseCurrencyString(double value)

参数:value:原始金额值

Kanas.Supports.Chinese.LundarDate

农历日期类型。为值类型(继承自System.ValueType)。考虑到实际需要与实现的代价间的平衡,该类型计算农历时采用词典算法,所以仅支持1900年至2050年,一共150年。

构造器:

以公历日期构造农历日期

LunarDate(DateTime date)

参数:date:公历日期

以农历日期参数构造农历日期

LunarDate(int year, int month, int day, bool isLeap)

参数:year:农历年;month:农历月;day:农历日;isLeap:是否为闰月

公共属性:

名称

类型

说明

Date

DateTime

公历日期

Year

string

农历年名

Month

string

农历月名

Day

string

农历日名

SolarName

string

节气名(如不存在节气则返回空串)

IsHoliday

bool

是否为假期,包括农历假期、五一、国庆假期

公共方法:

获取指定年月节气所在日列表

static int[] SolarTeamDays(int year, int month)

参数:year:指定年;month:指定月;

返回值:节气所在日的日期数组

Kanas.Supports.Chinese.PinyinList

拼音匹配表对象。该对象能够从一组中文串中查找出所有按拼音与给定码元串匹配的串。

匹配方式是取汉字对应拼音的第一个字母与码元串的对应字母比较,相等则为匹配。如果该汉字为多音字则可能匹配任何一个读音的第一个字母。如单字“长”和单字“朝”则既可匹配码元“c”也可匹配码元“z”。

例如:“李刚、李刚强、雷光、刘广青、梁忠”五个词汇,如果采用非完全匹配方式,给定串“l”,全部都可匹配;给定串“lg”,则“李刚、李刚强、雷光、刘广青”可以匹配;给定串“lgq”则只有“李刚强、刘广青”可以匹配。如果采用完全匹配方式,给定串“l”,没有可以匹配的;给定串“lg”,则“李刚、雷光”可以匹配;给定串“lgq”则只有“李刚强、刘广青”可以匹配。

构造器:

默认构造器

PinyinList()

公共方法:

比较中文源串与码元串中否匹配

bool Equals(string Source, string Code, bool Integraty)

参数:Source:中文源串;Code:码元串;Integrary:是否完整匹配,即是否先确定等长再匹配;

返回值:返回匹配结果


posted @ 2005-06-06 13:15 双鱼座 阅读(7242) 评论(19) 编辑 收藏

 回复 引用   
#1楼 2005-06-06 13:37 arbean
不错!
 回复 引用 查看   
#2楼 2005-06-06 13:47 James      
支持多種數據庫嗎?
支持多國語言嗎?

 回复 引用 查看   
#3楼[楼主] 2005-06-06 14:11 双鱼座      
to James:
目前只提供了SQL Server/OleDB/Oracle/ODBC/XML的适配器。不过因为适配器接口是公开的,所以很容易扩展。需要指明的是:Kanas.Net支持跨数据库(包括同构或异构数据库)的事务。
只支持En和Cn支持。但是增加一种语言支持只是增加一个Resource的问题。

 回复 引用 查看   
#4楼 2005-06-06 16:06 伤心一滴泪      
能不能发给我看看,我们公司的电脑不能下载
winlmh@5xp.net

 回复 引用 查看   
#5楼 2005-06-06 21:31 ccBoy      
不错的想法,为什么不开源?
 回复 引用 查看   
#6楼 2005-06-07 13:20 napoler      
好!!

拼音的部分加“返回拼音String”的功能怎么样?

农历→阳历 的怎么弄?

能否给点代码?

 回复 引用 查看   
#7楼[楼主] 2005-06-07 16:06 双鱼座      
to napoler:
这个类库不返回拼音编码。你看看资源库就知道只有每个汉字全部读音的拼音首字母。
农历到阳历很简单:有一个构造方法就是用农历日期的。
LunarDate ld = new LunarDate(2005, 5, 5, false);// 农历2005年五月初五
return ld.Date;//返回公历日期

 回复 引用   
#8楼 2005-06-08 20:22 tansm
很务实和严谨的工作态度,积极支持
顶。

 回复 引用 查看   
#9楼 2005-06-17 11:59 我的生活      
写的很好,支持。希望能发一下源码,我都等不及了。
 回复 引用 查看   
#10楼 2005-08-16 19:38 IT      
好东西,支持
LunarDate date=new LunarDate(System.DateTime.Now);
Console.Write(date.YearName +"\n");

这个返回为空字符,怎么回事????

 回复 引用   
#11楼 2005-11-09 19:18 小唐[未注册用户]
呵呵似曾相识:)
 回复 引用   
#12楼 2005-12-29 18:11 BenBenBen[未注册用户]
农历年没有实现啊,只是简单返回空字符串
 回复 引用 查看   
#13楼 2007-01-13 09:40 乌龙      
作为程序员,不熟悉sql和数据库是不行的。且不说一些复杂但高效的sql可以解决很多问题,就说性能优化,不熟悉sql和数据库怎么能写出性能过硬的程序。当然你会说这是DBA的工作,但一是不少中小公司都没有独立的DBA,二是会增加程序员和DBA的沟通成本,自己可以搞定为什么还要和别人说半天?所以至少在国内,不熟悉sql和数据库是不行的。
所以说,有ORM,封装了、隐藏了对DB的交互,是可以提高效率,但是对程序员个人,还是得熟悉SQL和数据库才行。

 回复 引用   
#14楼 2007-03-30 00:21 fffffffffffffff[未注册用户]
不开源的东西不要拿出来吹嘘!
 回复 引用 查看   
#15楼[楼主] 2007-03-30 14:32 双鱼座      
@fffffffffffffff
第一,没有开源么?你所指的开源是什么样的?这个算不算?
http://www.cnblogs.com/Barton131420/archive/2006/09/07/497496.html
第二,你从哪里看出来我在吹嘘?
实话说,我极其厌恶象你这样的家伙,其实你心目中的开源只是那种免费的午餐而已。但是我还是回复你了。不过你应该可以注意到,这篇文章是早期的文章,后面的文章我都迫不得已禁止了匿名回复,就是为了避免看到你这样的人的无聊的回复。

 回复 引用 查看   
#16楼 2007-11-04 16:43 Enzo      
@双鱼座
无关开源 交流就很好了

 回复 引用 查看   
#17楼 2010-04-25 02:25 享受代码      
以下是我的即时运算得到的结果,可见LZ的代码认识多音字,可还不认识多音词语。呵呵:-)

PY.Equals("行", "c", true)
false
PY.Equals("行", "h", true)
true
PY.Equals("行", "x", true)
true
PY.Equals("行走", "x", true)
false
PY.Equals("行走", "x", false)
true
PY.Equals("行走", "xz", false)
true
PY.Equals("行走", "hz", false)
true
PY.Equals("行走", "hz", true)
true

 回复 引用 查看   
#18楼 2010-04-25 02:40 享受代码      
我是个菜鸟,现在想在您的PinyinList类库基础上写一个方法,可以实习如下效果:
自行车->ZXC
银行->YH
我准备根据指定字符串的长度穷举指定长度的字母组合然后使用Equals方法去验证,现在看来是不行了。
前辈有没有更好的方法?

 回复 引用 查看   
#19楼[楼主] 2010-04-25 21:19 双鱼座      
字的读音是有穷的,词却是无穷的。如果有一个词库,实现你要的功能不困难。