public class Num2CHN
{
public static void main(String[] args){
try{
System.out.println(change(110111.32));
}catch(Exception e){
e.printStackTrace();
}
}
public static StringBuffer change(double num) throws Exception{
StringBuffer temp = change2CHN(getStringByNum(num));
if(temp.indexOf("圆")==-1){
temp.append("圆整");
}else{
temp.insert(temp.indexOf("圆")+2,"角");
if(temp.indexOf("圆")+4<=temp.length()){
temp.insert(temp.indexOf("圆")+4,"分");
}
temp.append("整");
}
String str = temp.toString().split("圆")[0];
int index=str.length()-1;
char[][] values = new char[3][4];
for(int i=0;i<values.length;i++){
for(int j=0;j<values[i].length;j++){
if(index>=0){
values[i][j]=str.charAt(index--);
}
}
}
return temp.replace(0,str.length(),getResult(values).toString());
} private static StringBuffer change2CHN(StringBuffer numString) throws Exception{
String temp = numString.toString();
String tempAry[] = temp.split("[.]");
if(tempAry.length>2) {
throw new Exception("not the price format!too more point");
}
if(tempAry.length>1&&tempAry[1].length()>2){
throw new Exception("not the price format!too long for cent!");
}
StringBuffer ret = new StringBuffer();
for(int i=0;i<temp.length();i++){
switch(temp.charAt(i)){
case '0' : ret.append("零");break;
case '1' : ret.append("壹");break;
case '2' : ret.append("贰");break;
case '3' : ret.append("叁");break;
case '4' : ret.append("肆");break;
case '5' : ret.append("伍");break;
case '6' : ret.append("陆");break;
case '7' : ret.append("柒");break;
case '8' : ret.append("捌");break;
case '9' : ret.append("玖");break;
case '.' : ret.append("圆");break;
case ',' : ;break;
default : throw new Exception("not the price format!");
}
}
return ret;
}
private static StringBuffer getStringByNum(double num) throws Exception{
StringBuffer _temp = new StringBuffer(num+"");
if(_temp.indexOf("E")>0){//科学计数法转换成普通计数
int point = _temp.indexOf(".");
int charE = _temp.indexOf("E");
int step = Integer.parseInt(_temp.substring(charE+1));
_temp = _temp.delete(charE,_temp.length());
_temp = _temp.deleteCharAt(point);
if(point+step>_temp.length()){
int sumIndex = point+step;
int zeroNum = sumIndex-_temp.length();
for(int i=0;i<zeroNum;i++){
_temp.insert(_temp.length(),"0");
}
}else{
_temp = _temp.insert(point+step,".");
}
}
return _temp;
}
private static StringBuffer getResult(char c[][]){
boolean f=false;
StringBuffer ret = new StringBuffer();
for(int i=0;i<c.length;i++){
if(c[i][0]!='\u0000'){
switch(i){
case 1 : ret.insert(0,"萬");break;
case 2 : ret.insert(0,"亿");break;
default : ;break;
}
}
for (int j=0;j<c[i].length ;j++ ){
if(c[i][j]=='零'){
if(f){
ret.insert(0,"零");
f=false;
}else{
continue;
}
}else if(c[i][j]!='\u0000'){
switch(j){
case 1 : ret.insert(0,"拾");break;
case 2 : ret.insert(0,"佰");break;
case 3 : ret.insert(0,"仟");break;
default : ;break;
}
ret = ret.insert(0,c[i][j]);
f=true;
}
}
}
return ret;
}
}
解决方案 »
- 贴帖子
- acegi
- 用Arrays.sort()来排序有什么缺点么??这个方便的方法用的怎么这么少呢?
- 关于一个servlet的编译警告问题
- 跪求解释 看不懂 jls.............类型参数和类型变量不是在运行时具体化的。因此,不同的参数化类型是由相同的类或接口在运行时实现的
- 求jBuilder注册机!
- 实际分析问题模型时,多线程的编程难点在哪里??
- java和SQLServer的存储过程!
- 关于编码转换的问题,我觉得java大斑竹(尤其是笑着悲伤)应该做一个faq,大家进来支持一下。
- Java Socket编程问题求教
- java多线程读取文件处理
- String str = new String("hello"); 为什么只创建了两个对象?
{
public static void main(String[] args){
try{
System.out.println(change(123));
}catch(Exception e){
e.printStackTrace();
}
}
public static StringBuffer change(double num) throws Exception{
StringBuffer temp = change2CHN(getStringByNum(num));
System.out.println(temp);
if(temp.indexOf("圆")==-1){
temp.append("圆整");
}else{
temp.insert(temp.indexOf("圆")+2,"角");
if(temp.indexOf("圆")+4<=temp.length()){
temp.insert(temp.indexOf("圆")+4,"分");
}
temp.append("整");
}
String str = temp.toString().split("圆")[0];
int index=str.length()-1;
char[][] values = new char[3][4];
for(int i=0;i<values.length;i++){
for(int j=0;j<values[i].length;j++){
if(index>=0){
values[i][j]=str.charAt(index--);
}
}
}
return temp.replace(0,str.length(),getResult(values).toString());
} private static StringBuffer change2CHN(StringBuffer numString) throws Exception{
System.out.println(numString);
String temp = numString.toString();
String tempAry[] = temp.split("[.]");
if(tempAry.length>2) {
throw new Exception("not the price format!too more point");
}
if(tempAry.length>1&&tempAry[1].length()>2){
throw new Exception("not the price format!too long for cent!");
}
StringBuffer ret = new StringBuffer();
for(int i=0;i<temp.length();i++){
switch(temp.charAt(i)){
case '0' : ret.append("零");break;
case '1' : ret.append("壹");break;
case '2' : ret.append("贰");break;
case '3' : ret.append("叁");break;
case '4' : ret.append("肆");break;
case '5' : ret.append("伍");break;
case '6' : ret.append("陆");break;
case '7' : ret.append("柒");break;
case '8' : ret.append("捌");break;
case '9' : ret.append("玖");break;
case '.' : ret.append("圆");break;
case ',' : ;break;
default : throw new Exception("not the price format!");
}
}
return ret;
}
private static StringBuffer getStringByNum(double num) throws Exception{
StringBuffer _temp = new StringBuffer(num+"");
if(_temp.indexOf("E")>0){//科学计数法转换成普通计数
int point = _temp.indexOf(".");
int charE = _temp.indexOf("E");
int step = Integer.parseInt(_temp.substring(charE+1));
_temp = _temp.delete(charE,_temp.length());
_temp = _temp.deleteCharAt(point);
if(point+step>_temp.length()){
int sumIndex = point+step;
int zeroNum = sumIndex-_temp.length();
for(int i=0;i<zeroNum;i++){
_temp.insert(_temp.length(),"0");
}
}else{
_temp = _temp.insert(point+step,".");
}
}else if(num%1==0){
_temp = new StringBuffer((int)num+"");
}
System.out.println(_temp);
return _temp;
}
private static StringBuffer getResult(char c[][]){
boolean f=false;
StringBuffer ret = new StringBuffer();
for(int i=0;i<c.length;i++){
if(c[i][0]!='\u0000'){
switch(i){
case 1 : ret.insert(0,"萬");break;
case 2 : ret.insert(0,"亿");break;
default : ;break;
}
}
for (int j=0;j<c[i].length ;j++ ){
if(c[i][j]=='零'){
if(f){
ret.insert(0,"零");
f=false;
}else{
continue;
}
}else if(c[i][j]!='\u0000'){
switch(j){
case 1 : ret.insert(0,"拾");break;
case 2 : ret.insert(0,"佰");break;
case 3 : ret.insert(0,"仟");break;
default : ;break;
}
ret = ret.insert(0,c[i][j]);
f=true;
}
}
}
return ret;
}
}现在没有零角这个bug了
然后再加上一些规定:
1。 零角零分的时候,要写 整
2。不是整圆的时候,要写到 分
这个是为了防止有人在后面续写,篡改金额。我们就当成是 规则 好了。 private static String transMoney(double money) throws Exception {
StringBuffer rsult = new StringBuffer();
String unit="千百十亿千百十万千百十元角分";
String number="零壹贰叁肆伍陆柒捌玖";
int moneyInt = (int)(money*100);
String moneyStr = String.format("%d", moneyInt);
int pos = unit.length() - moneyStr.length();
boolean zero = false;
for(int i=0;i<moneyStr.length();i++){
if (moneyStr.charAt(i) == '0'){
zero = true;
}else{
if (zero){
rsult.append(number.charAt(0));
}
zero = false;
rsult.append(number.charAt(moneyStr.charAt(i)-'0')).append(unit.charAt(pos+i));
}
}
if ((moneyInt % 100) == 0){
rsult.append('整');
}else if(zero){
rsult.append("零分");
}
return rsult.toString();
}测试结果:public static void main(String[] args) throws Exception {
double money = 1001.00;
System.out.println(transMoney(money)); <==壹千零壹元整
money = 1001.01;
System.out.println(transMoney(money)); <==壹千零壹元零壹分
money = 1001.10;
System.out.println(transMoney(money)); <==壹千零壹元壹角零分
money = 1011.00;
System.out.println(transMoney(money)); <==壹千零壹十壹元整
money = 1101.00;
System.out.println(transMoney(money)); <==壹千壹百零壹元整
}
StringBuffer rsult = new StringBuffer();
String unit="千百十亿千百十万千百十元角分";
String number="零壹贰叁肆伍陆柒捌玖";
String moneyStr = String.format("%.2f", money).replace(".","");
System.out.println(moneyStr);
int pos = unit.length() - moneyStr.length();
boolean zero = false;
for(int i=0;i<moneyStr.length();i++){
if (moneyStr.charAt(i) == '0'){
zero = true;
if(((pos+i+1)%4) == 0){
rsult.append(unit.charAt(pos+i));
zero = false;
}
}else{
if (zero){
rsult.append(number.charAt(0));
}
zero = false;
rsult.append(number.charAt(moneyStr.charAt(i)-'0')).append(unit.charAt(pos+i));
}
}
if (moneyStr.endsWith("00")){
rsult.append('整');
}else if(zero){
rsult.append("零分");
}
return rsult.toString();
}