`
h248980496
  • 浏览: 7352 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

项目中中文大写金额的工具类

阅读更多
关于中文大写,网上有很多代码可以下载使用,但是仔细看了,很多都不完美支持财务要求的中文大写规则,以前好像看到过中文大写类库,但是不记得了,于是只好自己写

财务规则:
零在元位和万位上时,这个零一般可写可不写。
阿拉伯小写金额数字中有“0”时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。举例如下:
  (一) 阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1409.50,应写成人民币壹仟肆佰零玖元伍角。
  (二) 阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6007.14,应写成人民币陆仟零柒元壹角肆分。
  (三) 阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但仟位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1680.32,应写成人民币壹仟陆佰捌拾元零三角贰分,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟元伍角叁分。
  (四) 阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾元零肆分。
  根据《中华人民共和国票据法》的相关规定:
  填写票据和结算凭证,必须做到标准化、规范化,要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。
  1、中文大写金额数字如零、壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿等,应用正楷或行书填写,不得自造简化字。如果金额数字书写中使用繁体字,也应受理(针对银行方)。
  2、中文大写金额数字到“元”为止的,在“元”之后,应写“整”(或“正”)字,在“角”之后可以不写“整”(或“正”)字。大写金额数字有“分”的,“分”后面不写“整”(或“正”)字。
  3、中文大写在写一般票据和银行支票是不一样的。一般票据的写法上面的天外非仙已经写得很清楚了,银行支票得写法就得把零全写上,不管0在什么位置,要写成零元零角零分。

import java.math.BigDecimal;

import org.apache.commons.lang.StringUtils;


/**
 * 
 * desc: 数字金额转换成中文大写财务金额工具类
 * 
 * @author <a href="mailto:yourmail">Hegege</a>
 * @version CVS $Revision: 1.1 $ $Date: 2005/12/05 08:42:21 $
 */
public class ChineseMoneyUtils {

 private String number[] = { "", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

 private String unit[] = { "", "拾", "佰", "仟" };

 private String small[] = { "角", "分" };

  public static void main(String[] args) {
 
  String d = "9078006005.04";
 
  Double x = Double.valueOf("9078006005.4");
  BigDecimal xx = BigDecimal.valueOf(x.doubleValue());
  String t = xx.toEngineeringString();
  // String d = "325.04";
  String y = getByNumber(Double.valueOf(0));
  String m = getByString(".02");
  String str = getByD(d);
 
  System.out.println(str);
 
  // CommonDao commonDao = new CommonDao();
  // try {
  // commonDao.getHibernateSession().connection();
  // commonDao.getHibernateSession().createSQLQuery("sql");
  // commonDao.getHibernateSession().close();
  //
  // } catch (HibernateException e) {
  // // TODO Auto-generated catch block
  // e.printStackTrace();
  // } catch (WAFException e) {
  // // TODO Auto-generated catch block
  // e.printStackTrace();
  // } finally{
  // try {
  // commonDao.getHibernateSession().close();
  // } catch (HibernateException e) {
  // // TODO Auto-generated catch block
  // e.printStackTrace();
  // } catch (WAFException e) {
  // // TODO Auto-generated catch block
  // e.printStackTrace();
  // }
  // }
 
  }

 /**
  * 根据数字类型返回中文大写的数字
  * 
  * @param number
  * @return
  */
 public static String getByNumber(Number number) {
  if (number != null) {
   BigDecimal xx = BigDecimal.valueOf(number.doubleValue());
   String t = xx.toEngineeringString();
   if (StringUtils.isNotEmpty(t)) {
    if (t.indexOf(".") > 0 && t.indexOf(".") == t.length() - 2) {
     t += "0";
    } else if (t.indexOf(".") > 0
      && t.indexOf(".") < t.length() - 2) {
     t = t.substring(0, t.indexOf(".") + 3);
    } else {
     t += ".00";
    }// 还漏掉t.indexOf(".")>0&&t.indexOf(".")==t.length()-1的判断,但是形参是Number类型,这种情况不会发生
    return getByD(t);
   } else {
    return null;
   }
  } else {
   return null;
  }
 }

 /**
  * 根据字符类型返回中文大写的数字
  * 
  * @param s
  * @return
  */
 public static String getByString(String s) {
  if (StringUtils.isNotEmpty(s)) {
   try {
    BigDecimal xx = BigDecimal.valueOf(Double.valueOf(s)
      .doubleValue());
    String t = xx.toEngineeringString();
    if (StringUtils.isNotEmpty(t)) {
     if (t.indexOf(".") > 0 && t.indexOf(".") == t.length() - 2) {
      t += "0";
     } else if (t.indexOf(".") > 0
       && t.indexOf(".") < t.length() - 2) {
      t = t.substring(0, t.indexOf(".") + 3);
     } else {
      t += ".00";
     }// 还漏掉t.indexOf(".")>0&&t.indexOf(".")==t.length()-1的判断,但是形参是Number类型,这种情况不会发生
     return getByD(t);
    } else {
     return null;
    }
   } catch (NumberFormatException e) {
    e.printStackTrace();
    System.out.println("********字符串不合法*******");
    return null;
   }
  } else {
   return null;
  }
 }

 /**
  * 形参必须是格式化的字符串xxxxxxxx.xx
  * 
  * @param d
  * @return("":数字是0,"0":数字太大) 
  * 
  *        零在元位和万位上时,这个零一般可写可不写。
  *                           阿拉伯小写金额数字中有“0”时,中文大写应按照汉语语言规律
  *                           、金额数字构成和防止涂改的要求进行书写。举例如下:
  * 
  *                             (一)
  *                           阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1,409.50
  *                           ,应写成人民币壹仟肆佰零玖元伍角。
  * 
  *                             (二)
  *                           阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6,007.14
  *                           ,应写成人民币陆仟零柒元壹角肆分。
  * 
  *                             (三)
  *                           阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”
  *                           ,但仟位、角位不是
  *                           “0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1,680.32
  *                           ,应写成人民币壹仟陆佰捌拾元零三角贰分
  *                           ,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107,000.53
  *                           ,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟元伍角叁分。
  * 
  *                              (四)
  *                           阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字
  *                           。如¥16,409.02
  *                           ,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾元零肆分。
  * 
  *                           根据《中华人民共和国票据法》的相关规定:
  *                           填写票据和结算凭证,必须做到标准化、规范化,要素齐全、
  *                           数字正确、字迹清晰、不错漏、不潦草,防止涂改。
  *                           1、中文大写金额数字如零、壹、贰、叁、肆、伍、陆
  *                           、柒、捌、玖、拾、佰、仟、万、亿等,应用正楷或行书填写
  *                           ,不得自造简化字。如果金额数字书写中使用繁体字,也应受理(针对银行方)。
  *                           2、中文大写金额数字到
  *                           “元”为止的,在“元”之后,应写“整”(或“正”)字,在“角”之后可以不写
  *                           “整”(或“正”)字。大写金额数字有“分”的,“分”后面不写“整”(或“正”)字。
  *                           3、中文大写在写一般票据和银行支票是不一样的
  *                           。一般票据的写法上面的天外非仙已经写得很清楚了,银行支票得写法就得把零全写上
  *                           ,不管0在什么位置,要写成零元零角零分。
  */
 private static String getByD(String d) {
  Double dd = Double.valueOf(d);
  if (dd < 10000000000.00d) {
   StringBuffer rs = new StringBuffer("");
   BigDecimal bigDecimal = new BigDecimal(d);

   String v = d;
   boolean substringflag = false;
   int sp = v.indexOf(".");
   String v1 = v.substring(0, sp);
   String v2 = v.substring(sp + 1, v.length());
   if ((bigDecimal
     .divideToIntegralValue(new BigDecimal(1000000000.00d)))
     .intValue() > 0) {
    // 十亿
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(1000000000.00d)))
      .intValue()));
    rs.append("拾");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("零");
   }

   if ((bigDecimal
     .divideToIntegralValue(new BigDecimal(100000000.00d)))
     .intValue() > 0) {
    // 亿
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(100000000.00d)))
      .intValue()));
    rs.append("億");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("億");
   }

   if ((bigDecimal.divideToIntegralValue(new BigDecimal(10000000.00d)))
     .intValue() > 0) {
    // 千万
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(10000000.00d)))
      .intValue()));
    rs.append("仟");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("零");
   }

   if ((bigDecimal.divideToIntegralValue(new BigDecimal(1000000.00d)))
     .intValue() > 0) {
    // 百万
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(1000000.00d)))
      .intValue()));
    rs.append("佰");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("零");
   }

   if ((bigDecimal.divideToIntegralValue(new BigDecimal(100000.00d)))
     .intValue() > 0) {
    // 十万
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(100000.00d)))
      .intValue()));
    rs.append("拾");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("零");
   }

   if ((bigDecimal.divideToIntegralValue(new BigDecimal(10000.00d)))
     .intValue() > 0) {
    // 万
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(10000.00d)))
      .intValue()));
    rs.append("萬");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("萬");
   }

   if ((bigDecimal.divideToIntegralValue(new BigDecimal(1000.00d)))
     .intValue() > 0) {
    // 千
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(1000.00d)))
      .intValue()));
    rs.append("仟");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("零");
   }

   if ((bigDecimal.divideToIntegralValue(new BigDecimal(100.00d)))
     .intValue() > 0) {
    // 百
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(100.00d)))
      .intValue()));
    rs.append("佰");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("零");
   }

   if ((bigDecimal.divideToIntegralValue(new BigDecimal(10.00d)))
     .intValue() > 0) {
    // 十
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(10.00d)))
      .intValue()));
    rs.append("拾");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("零");
   }

   if ((bigDecimal.divideToIntegralValue(new BigDecimal(1.00d)))
     .intValue() > 0) {
    // 元
    rs.append(getNum((bigDecimal
      .divideToIntegralValue(new BigDecimal(1.00d)))
      .intValue()));
    rs.append("圆");
    v = v.substring(1);
    sp = v.indexOf(".");
    v1 = v.substring(0, sp);
    bigDecimal = new BigDecimal(v);
    substringflag = true;
   } else {
    if (substringflag) {
     v = v.substring(1);
    }
    rs.append("圆");
   }

   if ("00".equals(v2)) {
    rs.append("整");
   } else {
    if (!"0".equals(v2.substring(0, 1))) {
     Integer k = Integer.valueOf(v2.substring(0, 1));
     rs.append(getNum(k.intValue()));
     rs.append("角");
    } else {
     rs.append("零");
    }

    if (!"0".equals(v2.substring(1, 2))) {
     Integer k = Integer.valueOf(v2.substring(1, 2));
     rs.append(getNum(k.intValue()));
     rs.append("分");
    } else {

    }

   }

   String rss = rs.toString();
   rss = rss.replaceAll("零零零", "零");
   rss = rss.replaceAll("零零", "零");
   rss = rss.replaceAll("零億", "億");
   rss = rss.replaceAll("零萬", "萬");
   rss = rss.replaceAll("零圆", "圆");
   if (rss.startsWith("零")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("億")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("零")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("萬")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("零")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("圆")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("零")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("拾")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("零")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("佰")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("零")) {
    rss = rss.substring(1);
   }
   if (rss.startsWith("仟")) {
    rss = rss.substring(1);
   }

   if ("整".equals(rss))
    rss = "";

   return rss;
  } else {
   return "0";
  }
 }

 private static String getNum(int intValue) {
  if (intValue == 1) {
   return "壹";
  } else if (intValue == 2) {
   return "贰";
  } else if (intValue == 3) {
   return "叁";
  } else if (intValue == 4) {
   return "肆";
  } else if (intValue == 5) {
   return "伍";
  } else if (intValue == 6) {
   return "陆";
  } else if (intValue == 7) {
   return "柒";
  } else if (intValue == 8) {
   return "捌";
  } else if (intValue == 9) {
   return "玖";
  } else {
   return "零";
  }

 }

}

分享到:
评论

相关推荐

    Android中数字转中文,金额转大写

    在实际项目中,我们可以将这些转换功能封装到单独的工具类中,方便复用。同时,考虑到性能和可维护性,可以考虑使用预编译的表达式或者查找表来优化转换过程。 综上所述,Android中实现数字转中文和金额转大写主要...

    数字金额转成中文大写

    在IT行业中,尤其是在财务软件开发或者电子商务系统的支付模块,将数字金额转换成中文大写是一项重要的功能。这有助于防止因为数字格式错误导致的财务纠纷,同时满足了中国传统的会计规范,确保账目清晰准确。本篇...

    人民币大写金额转换DLL库

    在IT行业中,人民币大写金额转换是一个常见的需求,特别是在财务软件、银行系统或者会计系统中。这个DLL库的出现,为开发者提供了一个便捷的工具,能够自动将阿拉伯数字形式的人民币金额转换为汉字大写,同时也支持...

    将数字转为中文金额的大写方式(C++版)

    本项目提供了一个C++实现的解决方案,将数字转化为符合中国传统的中文大写金额格式。 首先,我们要理解中文金额大写的规则。在中国,数字的中文大写形式有特定的对应关系: 1. 零 - 零 2. 一 - 壹 3. 二 - 贰 4. ...

    大写金额转换器

    【大写金额转换器】是一种实用工具,专为金融、会计和商业领域的用户设计,能够将数字金额转换成中文大写形式。在处理财务文件、合同或者发票时,按照中国的传统,金额通常需要以中文大写来表示,以增强文档的清晰度...

    将阿拉伯数字转换为金额的汉字大写

    在实际项目中,这样的功能可能会被封装在一个独立的类或者工具包中,以供其他模块调用,提高代码的复用性。 总的来说,将阿拉伯数字转换为金额的汉字大写是Java在财务领域中的一项基础应用,它体现了编程语言处理...

    C#金额小写转大写

    在压缩包中,`说明.txt`文件可能包含了详细的使用说明和代码实现逻辑,而`AmountTransfer`可能是项目中的主要源代码文件,包含实现金额转换功能的类或方法。通过阅读`AmountTransfer`源代码,我们可以更深入地了解...

    金额转大写

    4. **处理特殊字符**:在中文大写金额中,某些数字组合有特定的表示,比如10到19、20、50、100等,需要特殊处理。 5. **组合结果**:将转换后的中文字符按照正确的顺序组合起来,同时处理千位、万位、亿位等的分隔...

    金钱大写转小写数字类java(精确到角)

    在实际项目中,为了提高代码的可维护性和可扩展性,可以将映射表和解析逻辑封装成更独立的组件,例如使用枚举类型表示中文数字和单位,或者创建一个解析器类来处理不同的部分。 总的来说,实现中文大写转小写数字的...

    高效率的人民币金额转大写程序php类.zip

    在这个类中,属性可能包括一些预定义的转换规则,如零到九的数字对应的汉字,以及“元”、“角”、“分”等货币单位的汉字表示。方法可能包含一个主要的转换函数,该函数接受数字金额作为输入,然后按照特定的规则...

    SQL数据库访问及数字转换中文大写

    同时,还包含了将数字转换为中文大写的工具,这对于财务或会计系统尤其有用,因为在中国,金额通常需要以中文大写形式表示以避免混淆和错误。 首先,让我们详细了解一下SQL SERVER数据库访问类。这个类库(DBClass....

    金额小写转大写_sql函数.rar

    整数部分可以通过循环和条件判断,将每一位数字映射到对应的汉字大写字符。对于小数部分,可以设置相应的规则,如保留几位小数,并将其转换为百分比形式。在某些数据库系统中,如Oracle,可能有内置的函数可以直接...

    用Jscript编写的人民币小写转大写代码。

    人民币小写转大写的功能,其核心在于将数字字符串(如"123456.78")转换为对应的中文大写金额(如"壹拾贰万叁仟肆佰伍拾陆元柒角捌分")。实现这个功能的关键步骤包括: 1. **金额分割**:将金额分为整数部分和小数...

    使用java将人民币金额转换成大写并使用自定义标签显示到页面

    在中文环境中,人民币的金额通常使用大写表示,以便于财务报表的规范性和防止篡改。本篇将介绍如何使用Java编程语言将人民币金额转换成大写,并且通过自定义标签库(Tag Library)在网页上显示。首先,我们来看`...

    将数字转为中文金额的大写方式(Java版)

    在财务领域,为了确保金额的准确无误,通常需要将数字转化为中文大写形式,以便在会计报表和合同中使用。本篇文章主要探讨的是如何使用Java实现数字到中文金额大写的转换。 首先,`Trans2RMB.java`是这个功能的核心...

    C#数字转大写。重铸优化版(dll类库)

    重铸优化版(dll类库)”是一个专注于阿拉伯数字到中文大写转换的工具,适用于需要此功能的C#项目。它支持大范围的整数和小数转换,遵循传统的中国计数规则,通过DLL文件提供服务,方便开发者集成到他们的应用程序中。...

    加解密,金额大写

    其次,金额大写转换在财务软件和银行系统中非常常见,它涉及到将阿拉伯数字转换为中文大写数字,以避免在处理大量金钱时的误解。在Java中,可以编写函数或者使用现有的库来实现这个功能。基本思路是定义一个映射表,...

    java传入金额(数字)转化成大写

    根据给定的文件信息,我们将探讨如何在Java中实现将输入的金额数字转换为大写的中文表示形式。这种转换在财务、银行系统等场景中非常常见,有助于提高数据的可读性和规范性。 ### Java传入金额(数字)转换成大写的...

    ATM自动取款机&金额转换成大写

    在Java中,可以编写一个辅助方法,将数字转换为中文大写的表示,例如“壹”、“贰”等。这个过程可能涉及到字符串处理和数字比较,可以使用switch语句或者映射表来实现。 在开发ATM模拟程序时,我们还需要考虑以下...

    java钱币小写转换大写

    这个工具类中的`toChineseCapital`方法可以接收一个小写金额字符串,返回转换后的人民币大写表示。在实际项目中,可能还需要对输入进行校验,确保其格式正确,例如检查是否包含非法字符,金额是否超出合理范围等。 ...

Global site tag (gtag.js) - Google Analytics