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”时,中文大写金额要写“零”字。如¥1,409.50,应写成人民币壹仟肆佰零玖元伍角。 (二)阿拉伯数字中间连续有几个“0”时,中文大写金额中间可以只写一个“零”字。如¥6,007.14,应写成人民币陆仟零柒元壹角肆分。 (三)阿拉伯金额数字万位或元位是“ (四)阿拉伯金额数字角位是“ 五、阿拉伯小写金额数字前面,均应填写入民币符号“¥”(或草写:)。阿拉伯小写金额数字要认真填写,不得连写分辨不清。 六、票据的出票日期必须使用中文大写。为防止变造票据的出禀日期,在填写月、日时,月为壹、贰和壹拾的,日为壹至玖和壹拾、贰拾和叁拾的,应在其前加“零”;日为抬壹至拾玖的,应在其前加“壹”。如 七、票据出票日期使用小写填写的,银行不予受理。大写日期未按要求规范填写的,银行可予受理,但由此造成损失的,由出票入自行承担。 本类型中的相关算法遵守以上基本规定,但尽可能短,即:可以不写“零”的地方一律不写“零”。此外,考虑到有可能“人民币”字样已印在纸样上,本类型返回的大写金额串结果中将不出现该字样。 |
|
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:是否完整匹配,即是否先确定等长再匹配; 返回值:返回匹配结果 |