当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

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

发表于: 2012-08-27   作者:h248980496   来源:转载   浏览:
摘要: 关于中文大写,网上有很多代码可以下载使用,但是仔细看了,很多都不完美支持财务要求的中文大写规则,以前好像看到过中文大写类库,但是不记得了,于是只好自己写 财务规则: 零在元位和万位上时,这个零一般可写可不写。 阿拉伯小写金额数字中有“0”时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。举例如下:   (一) 阿拉伯数字中间有“0”时,中文大写金额中间可以
关于中文大写,网上有很多代码可以下载使用,但是仔细看了,很多都不完美支持财务要求的中文大写规则,以前好像看到过中文大写类库,但是不记得了,于是只好自己写

财务规则:
零在元位和万位上时,这个零一般可写可不写。
阿拉伯小写金额数字中有“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 "零";
  }

 }

}

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号