Java货币金额转换为大写形式

1package com.test; 2 3import java.math.BigDecimal; 4 5/** 6 * 7 * 8 * 数字转换为汉语中人民币的大写<br> 9 * 10 */ 11public class NumberToCN { 12 /** 13 * 汉语中数字大写 14 */ 15 private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆", 16 "伍", "陆", "柒", "捌", "玖" }; 17 /** 18 * 汉语中货币单位大写,这样的设计类似于占位符 19 */ 20 private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元", 21 "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", 22 "佰", "仟" }; 23 /** 24 * 特殊字符:整 25 */ 26 private static final String CN_FULL = "整"; 27 /** 28 * 特殊字符:负 29 */ 30 private static final String CN_NEGATIVE = "负"; 31 /** 32 * 金额的精度,默认值为2 33 */ 34 private static final int MONEY_PRECISION = 2; 35 /** 36 * 特殊字符:零元整 37 */ 38 private static final String CN_ZEOR_FULL = "零元" + CN_FULL; 39 40 /** 41 * 把输入的金额转换为汉语中人民币的大写 42 * 43 * @param numberOfMoney 44 * 输入的金额 45 * @return 对应的汉语大写 46 */ 47 public static String number2CNMontrayUnit(BigDecimal numberOfMoney) { 48 StringBuffer sb = new StringBuffer(); 49 // -1, 0, or 1 as the value of this BigDecimal is negative, zero, or 50 // positive. 51 int signum = numberOfMoney.signum(); 52 // 零元整的情况 53 if (signum == 0) { 54 return CN_ZEOR_FULL; 55 } 56 // 这里会进行金额的四舍五入 57 long number = numberOfMoney.movePointRight(MONEY_PRECISION) 58 .setScale(0, 4).abs().longValue(); 59 // 得到小数点后两位值 60 long scale = number % 100; 61 int numUnit = 0; 62 int numIndex = 0; 63 boolean getZero = false; 64 // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11 65 if (!(scale > 0)) { 66 numIndex = 2; 67 number = number / 100; 68 getZero = true; 69 } 70 if ((scale > 0) && (!(scale % 10 > 0))) { 71 numIndex = 1; 72 number = number / 10; 73 getZero = true; 74 } 75 int zeroSize = 0; 76 while (true) { 77 if (number <= 0) { 78 break; 79 } 80 // 每次获取到最后一个数 81 numUnit = (int) (number % 10); 82 if (numUnit > 0) { 83 if ((numIndex == 9) && (zeroSize >= 3)) { 84 sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]); 85 } 86 if ((numIndex == 13) && (zeroSize >= 3)) { 87 sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]); 88 } 89 sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]); 90 sb.insert(0, CN_UPPER_NUMBER[numUnit]); 91 getZero = false; 92 zeroSize = 0; 93 } else { 94 ++zeroSize; 95 if (!(getZero)) { 96 sb.insert(0, CN_UPPER_NUMBER[numUnit]); 97 } 98 if (numIndex == 2) { 99 if (number > 0) { 100 sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]); 101 } 102 } else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) { 103 sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]); 104 } 105 getZero = true; 106 } 107 // 让number每次都去掉最后一个数 108 number = number / 10; 109 ++numIndex; 110 } 111 // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负 112 if (signum == -1) { 113 sb.insert(0, CN_NEGATIVE); 114 } 115 // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整 116 if (!(scale > 0)) { 117 sb.append(CN_FULL); 118 } 119 return sb.toString(); 120 } 121 122 public static void main(String[] args) { 123 double money = 3000.66; 124 BigDecimal numberOfMoney = new BigDecimal(money); 125 String s = NumberToCN.number2CNMontrayUnit(numberOfMoney); 126 System.out.println("你输入的金额为:【" + money + "】 #--# [" + s.toString() 127 + "]"); 128 } 129}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前