`
azheng270
  • 浏览: 93282 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

货币 和 日期 转 中文大写

F# 
阅读更多

货币数值转中文大写

package com.th.kits.Impl;

import java.math.BigDecimal;

/**
* 阿拉伯数字转中文大写
*/
public class MoneyToUpperChinese {

/** 大写数字 */
private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

/** 整数部分的单位 */
private static final String[] IUNIT = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" };

/** 小数部分的单位 */
private static final String[] DUNIT = { "角", "分", "厘" };

/**
* 得到大写金额。
*/
public synchronized static String toChinese(String str) {
boolean isNegative = false;
if (str.startsWith("-")) {
isNegative = true;
str = str.substring(1);
}

Float f = Float.parseFloat(str);
if (f.intValue() == 0) {
return "零元整";
}

str = str.replaceAll(",", "");// 去掉","
String integerStr;// 整数部分数字
String decimalStr;// 小数部分数字

// 初始化:分离整数部分和小数部分
if (str.indexOf(".") > 0) {
integerStr = str.substring(0, str.indexOf("."));
decimalStr = str.substring(str.indexOf(".") + 1);
} else if (str.indexOf(".") == 0) {
integerStr = "";
decimalStr = str.substring(1);
} else {
integerStr = str;
decimalStr = "";
}
// integerStr去掉首0,不必去掉decimalStr的尾0(超出部分舍去)
if (!integerStr.equals("")) {
integerStr = Long.toString(Long.parseLong(integerStr));
if (integerStr.equals("0")) {
integerStr = "";
}
}
// overflow超出处理能力,直接返回
if (integerStr.length() > IUNIT.length) {
System.out.println(str + ":超出处理能力");
return str;
}

int[] integers = toArray(integerStr);// 整数部分数字
boolean isMust5 = isMust5(integerStr);// 设置万单位
int[] decimals = toArray(decimalStr);// 小数部分数字

if (isNegative) {
return "负" + getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
} else {
return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
}

}

/**
* 得到大写金额 double
*/
public synchronized static String toChinese(double doubleStr) {
return toChinese(String.valueOf(doubleStr));
}

/** 得到大写金额 BigDecimal */
public synchronized static String toChinese(BigDecimal bd) {
return toChinese(bd.toString());
}

/**
* 整数部分和小数部分转换为数组,从高位至低位
*/
private static int[] toArray(String number) {
int[] array = new int[number.length()];
for (int i = 0; i < number.length(); i++) {
array[i] = Integer.parseInt(number.substring(i, i + 1));
}
return array;
}

/**
* 得到中文金额的整数部分。
*/
private static String getChineseInteger(int[] integers, boolean isMust5) {
StringBuffer chineseInteger = new StringBuffer("");
int length = integers.length;
for (int i = 0; i < length; i++) {
// 0出现在关键位置:1234(万)5678(亿)9012(万)3456(元)
// 特殊情况:10(拾元、壹拾元、壹拾万元、拾万元)
String key = "";
if (integers[i] == 0) {
if ((length - i) == 13)// 万(亿)(必填)
key = IUNIT[4];
else if ((length - i) == 9)// 亿(必填)
key = IUNIT[8];
else if ((length - i) == 5 && isMust5)// 万(不必填)
key = IUNIT[4];
else if ((length - i) == 1)// 元(必填)
key = IUNIT[0];
// 0遇非0时补零,不包含最后一位
if ((length - i) > 1 && integers[i + 1] != 0)
key += NUMBERS[0];
}
chineseInteger.append(integers[i] == 0 ? key : (NUMBERS[integers[i]] + IUNIT[length - i - 1]));
}
return chineseInteger.toString();
}

/**
* 得到中文金额的小数部分。TODO
*/
private static String getChineseDecimal(int[] decimals) {
StringBuffer chineseDecimal = new StringBuffer("");
for (int i = 0; i < decimals.length; i++) {
// 舍去3位小数之后的
if (i == 3)
break;
if (i == 0 && decimals[i] == 0) {
chineseDecimal.append("零");
}
chineseDecimal.append(decimals[i] == 0 ? "" : (NUMBERS[decimals[i]] + DUNIT[i]));
}
System.out.println(chineseDecimal.length());
if (chineseDecimal.length() < 2) {
return "整";
} else {
return chineseDecimal.toString();
}
}

/**
* 判断第5位数字的单位"万"是否应加。
*/
private static boolean isMust5(String integerStr) {
int length = integerStr.length();
if (length > 4) {
String subInteger = "";
if (length > 8) {
// 取得从低位数,第5到第8位的字串
subInteger = integerStr.substring(length - 8, length - 4);
} else {
subInteger = integerStr.substring(0, length - 4);
}
return Integer.parseInt(subInteger) > 0;
} else {
return false;
}
}

public synchronized static String toChineseNum(BigDecimal strNum) {
String fnum = FormatCurrency.getNumNoDot(strNum);
char[] cnum = fnum.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < cnum.length; i++) {
sb.append(NUMBERS[Integer.valueOf(String.valueOf(cnum[i]))]);
}
return sb.toString();
}

public synchronized static String toChineseNum(String strNum) {
String fnum = FormatCurrency.getNumNoDot(Double.valueOf(strNum));
char[] cnum = fnum.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < cnum.length; i++) {
sb.append(NUMBERS[Integer.valueOf(String.valueOf(cnum[i]))]);
}
return sb.toString();
}

public synchronized static String toChineseNum(double strNum) {
String fnum = FormatCurrency.getNumNoDot(strNum);
char[] cnum = fnum.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < cnum.length; i++) {
sb.append(NUMBERS[Integer.valueOf(String.valueOf(cnum[i]))]);
}
return sb.toString();
}

public static void main(String[] args) {
String number = "606060.06";
System.out.println(number);
// System.out.println(toChinese(new BigDecimal(number)));
System.out.println(toChinese(number));
}

}

日期字符串转中文大写

packagecom.th.kits.Impl;

importjava.util.regex.Matcher;
importjava.util.regex.Pattern;

publicclassDateToUpperChinese{

privatestaticfinalString[]NUMBERS={"","","","","","",
"","","",""};

/**通过yyyy-MM-dd得到中文大写格式yyyyMMdd日期*/
publicstaticsynchronizedStringtoChinese(Stringstr){
StringBuffersb
=newStringBuffer();
sb.append(getSplitDateStr(str,
0)).append("").append(
getSplitDateStr(str,
1)).append("").append(
getSplitDateStr(str,
2));
returnsb.toString();
}

/**分别得到年月日的大写默认分割符"-"*/
publicstaticStringgetSplitDateStr(Stringstr,intunit){
//unit是单位0=年1=月2日
String[]DateStr=str.split("-");
if(unit>DateStr.length)
unit
=0;
StringBuffersb
=newStringBuffer();
for(inti=0;i<DateStr[unit].length();i++){

if((unit==1||unit==2)&&Integer.valueOf(DateStr[unit])>9){
sb.append(convertNum(DateStr[unit].substring(
0,1)))
.append(
"").append(
convertNum(DateStr[unit].substring(
1,2)));
break;
}
else{
sb.append(convertNum(DateStr[unit].substring(i,i
+1)));
}
}
if(unit==1||unit==2){
returnsb.toString().replaceAll("^壹","").replace("","");
}
returnsb.toString();

}

/**转换数字为大写*/
privatestaticStringconvertNum(Stringstr){
returnNUMBERS[Integer.valueOf(str)];
}

/**判断是否是零或正整数*/
publicstaticbooleanisNumeric(Stringstr){
Patternpattern
=Pattern.compile("[0-9]*");
MatcherisNum
=pattern.matcher(str);
if(!isNum.matches()){
returnfalse;
}
returntrue;
}

publicstaticvoidmain(Stringargs[]){

System.out.println(toChinese(
"2008-10-02"));

}

}

分享到:
评论

相关推荐

    大写日期大写金额

    综上所述,“大写日期大写金额”的处理涉及到中文日期和金额格式化,以及在编程中的实现,这对提升财务数据的清晰度和安全性具有重要意义。通过理解和掌握这些知识,开发者能够创建更符合中国财务规范的软件产品。

    Excel-数字转换换成中文大写

    在“单元格格式”对话框中,左侧有六个选项卡,分别是“数字”、“货币”、“日期”、“时间”、“百分比”和“自定义”。点击“数字”选项卡。 5. **选择特殊类型**: 在“数字”选项卡中,向下滚动到“分类”...

    人民币大写金额的规范.pdf

    《人民币大写金额的规范》涉及的是金融领域中关于填写货币金额的重要规则,这些规则确保了支付结算的准确性和安全性。在处理银行业务、单位记账和个人交易时,正确书写大写金额至关重要,因为它直接关联到会计凭证的...

    Java常用工具类(持续发布,第一部分:日期、字符串、JSON工具类等)

    关于货币工具类,虽然Java标准库没有专门处理货币格式化的类,但我们可以自定义一个工具类,实现将数字货币转换为大写汉字的功能。通常涉及将数字转化为中文大写数字,如将123456转换为“壹拾贰万叁仟肆佰伍拾陆”。...

    Money And Date toChinese Java

    在Java编程语言中,将数字、日期或者货币转换为中文大写是常见的需求,尤其是在财务报表、发票等正式文档中。"Money and Date to Chinese Java"项目正专注于解决这一问题,提供了一种高效且准确的方法来实现这个功能...

    人民币金额大写规则.docx

    1. **汉字选择**:用于书写金额的大写汉字必须使用正楷或行书字,如“壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整(正)”。不得使用简化字或非标准字形,例如“一、二(两)、三...

    人民币大写的写法规范-3页.pdf

    - 出票日期必须使用中文大写,以防止篡改。 - 月为壹、贰和壹拾,日为壹至玖和壹拾、贰拾、叁拾的,前应加“零”;日为拾壹至拾玖的,前应加“壹”。 正确书写人民币金额不仅能保障经济交易的准确性,还能避免因...

    单位和汇率处理函数

    四、数字金额转中文大写 在财务报表或发票中,有时需要将数字金额转化为中文大写表示,以符合中国的财务规定。在SAP ABAP中,可以编写一个自定义程序来实现这一功能。程序通常会遍历数字的每一位,根据位值转化为...

    文正票据通 v5.1.zip

    转换成多个可调的大写日期数字,一体的小写日期数字,多个可调的大写日期数字;多个可调的小写数字;感受强大的关联和转换。 数据可以导入导出: 比如可以把联系单位、用途、结算方式、货币符号,业务种类、证件...

    财会实训指导书.doc

    例如,公历日期“2021年10月4日”需写成“贰零贰壹年拾月零肆日”,确保每一位数字都准确无误地转化成相应的中文大写形式,并且在日期的书写中不得存在涂改,这一点对于维护财务凭证的严肃性与合法性至关重要。...

    Excel模板银行支票自动填充表.zip

    在金融文件中,金额通常需要同时显示小写和大写形式,模板通过查找和替换的公式,能快速将阿拉伯数字转换为汉字大写,如“壹”、“贰”等,极大地节省了人工转换的时间。 再者,模板还可能包含自动计算功能,比如...

    Excel-165个VBA自定义函数大全

    在财务报告和正式文件中,将金额数字转换为中文大写是常见的需求,该函数简化了这一过程,确保了文档的专业性和准确性。 #### 8. 计算某种税金 虽然具体税种未明确,但此函数提供了一个通用框架来计算不同类型的...

    C#实例:人民币大小写转换程序

    - 数字与汉字的对应关系:需要建立一个字典或者数组,存储0到9对应的汉字,以及大写的“拾”、“佰”、“仟”、“万”、“亿”等。 - 使用条件判断和循环来实现数字到汉字的转换,比如检查个位、十位、百位等是否...

    POI操作excel

    在本文中,我们将详细探讨如何使用POI库操作Excel文件,特别是设置单元格的格式,如日期、小数、货币和百分比格式。 首先,POI库的NPOI组件专门用于处理Excel文件。通过NPOI,我们可以轻松地在客户端进行格式设置,...

    大小写金额转换-源码

    {-------------------------------------------------------------------- 货币数字转为为中文大写的组件 Version 1.31 by SNAKEJIAO 2003.4.13简介: 可以转化整数,浮点数,及时间日期型数据 配合别名列表可以进行...

    VBScript 语言参考中文手册CHM

    日期和时间常数 在日期和时间运算中用来定义星期几和其他常数的常数列表。 日期格式常数 用于日期和时间格式的常数列表。 Date 函数 返回当前系统日期。 DateAdd 函数 返回加上了指定的时间间隔的日期。 ...

    c#常用代码段

    5. **人民币大小写金额转换**:在金融应用中,需要将阿拉伯数字的金额转换为汉字大写的格式,以符合财务规范。这通常涉及到一系列的条件判断和字符串拼接。例如,编写一个函数,根据输入的数字,将“123456.78”转换...

    excel中161个VBA_自定义函数(超级实用)

    该函数实现了人民币金额在大写和小写之间的相互转换,满足了财务文档中对于金额书写的规范要求。 #### 10. 查汉字区位码 此函数用于查找汉字的区位码,对于汉字编码研究或特定汉字的编码查询有重要意义。 #### 11...

    学习函数你可能还不知道的100件事(第2季)

    单元格格式指的是显示样式(如货币、日期等),而数据类型则指数据的本质属性(数字、文本等)。 - **文本型数字转换方法**: - 使用`--`、`*1`、`VALUE`等操作。 - 通过**分列**功能将文本分割。 - 利用剪贴板...

    VBSCRIPT中文手册

    VBSCRIPT中文手册,这里的信息可以帮你很方便地浏览 Visual Basic 脚本的许多不同部分。 你可以找到在按字母排序的关键字列表中列出的 VBScript 语言的所有部分。如果你只想调阅某一部分,例如“对象”,那么语言的每...

Global site tag (gtag.js) - Google Analytics