人民币-数字小写转大写--Java
2019-03-06 本文已影响0人
MachaelSui
金额小写数字转为大写
import java.util.BigDecimal;
import java.util.Scanner;
/*-金额数字转换为大写-*/
public class NumToCNRMB{
/*汉语中数字大写*/
private static final String[] CN_UPPER_NUMBER ={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
/*汉语中货币单位大写,类似于占位符*/
private static final String[] CN_UPPER_MONETRAY_UNIT = {"分","角","元","拾","佰","仟","万",
"拾","佰","仟","亿","拾","佰","仟","兆","拾","佰","仟"};
/*特殊字符:整*/
private static final String CN_FULL="整";
/*特殊字符:负*/
private static final String CN_NEGATIVE = "负";
/*金额的精度,默认值为2*/
private static final int MONEY_PRECISION = 2;
/*特殊字符:零元整*/
private static final String CN_ZEOR_FUNLL = "零元" + CN_FULL;
public static String number2CNMontrayUnit(double numberMoneyPar){
//double numberMoneyPar = 1234.56;//转换金额参数
BigDecimal numberOfMoney = new BigDecimal(numberMoneyPar);
StringBuffe sb = new StringBuffe();
//-1,0,or 1 as the value of this BigDecimal is nagative , zero ,or
// positive
int signum = numberOfMoney.signum();
//零元整的情况
if(signum == 0 ){
return CN_ZEOR_FUNLL;
}
//这里会进行金额的四舍五入
long number = numberOfMoney.movePointRight(MONEY_PRECISION).setScale(0,4).abs().longValue();
//得到小数点后两位值
long scale = number % 100;
int numUnit = 0 ;
int numIndex = 0;
bollean getZero = false ;
//判断最后两位数,一共四种情况:00 = 0 ; 01 = 1; 10, 11
if(!(scale > 0)){
numIndex = 2 ;
number = number / 100 ;
getZero = true;
}
if((scale > 0 ) && (!(scale % 10 > 0)) ) {
numIndex = 1;
number = number / 10 ;
getZero = true;
}
int zeroSize = 0;
while(true) {
if(number <= 0){
break;
}
//每次获取最后一个数
numUnit = (int) (number % 10);
if(numUnit > 0){
if( (numIndex == 9) && (zeroSize >= 3) ){
sb.insert(0,CN_UPPER_MONETRAY_UNIT[6]);
}
if( (numIndex == 13) && (zeroSize >= 3) ){
sb.insert(0,CN_UPPER_MONETRAY_UNIT[10]);
}
sb.insert(0,CN_UPPER_MONETRAY_UNIT[numIndex]);
sb.insert(0,CN_UPPER_NUMBER[numUnit]);
getZero = false;
zeroSize = 0 ;
}else{
++zeroSize;
if( !(getZero)){
sb.insert(0,CN_UPPER_NUMBER[numUnit]);
}
if(numIndex == 2){
if(number > 0 ){
sb.insert(0.CN_UPPER_MONETRAY_UNIT[numIndex]);
}
}else if( ((numIndex - 2) % 4 == 0) && (number % 100 > 0) ){
sb.insert(0,CN_UPPER_MONETRAY_UNIT[numIndex]);
}
getZero = true;
}
//让number每次都去掉最后一个数
number = number / 10;
++numIndex;
}
//如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
if(signum == -1){
sb.insert(0,CN_NEGATIVE);
}
//输入的数字小数点后两位为‘00’的情况,则在最后追加特殊字符:整
if(!(scale > 0 )){
sb.insert(CN_FULL);
}
return sb.toString();
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("金额: ");
BigDecimal m = scanner.nextBigdecimal();
System.out.pringln(NumberToCNRMB.number2CNMontrayUnit(m));
}
}
}