/*** 辅助类* 用于记载字符和位置**/
class CharPos{char c;int pos;public CharPos(char c,int pos){this.c=c;this.pos=pos;}
}

import java.lang.reflect.Array;/*** 泛型栈** @param <T>*/
public class Stack<T>{private Class<T> type;// 栈元素所属的类private int size;// 栈深度private T[] arr;// 用数组存储private int top;// 栈顶元素的下标public Stack(Class<T> type,int size){this.type = type;this.size=size;arr=createArray(size);top=-1;}/*** 创建数组* @param size* @return*/@SuppressWarnings("unchecked")    private T[] createArray(int size) {    return (T[]) Array.newInstance(type, size);    }/*** 压栈* @param t*/public void push(T t){top++;arr[top]=t;}/*** 出栈* @return*/public T pop(){T t=arr[top];top--;return t;}/*** 取栈顶元素* @return*/public T peek(){return arr[top];}/*** 判断栈是否为空* @return*/public boolean isEmpty(){return top==-1;}/*** 判断栈是否满了* @return*/public boolean isFull(){return top==(size-1);}public static void main(String[] args){Stack<String> s=new Stack<String>(String.class,100);s.push("以恒心为良友");s.push("以经验为参谋");s.push("以小心为兄弟");s.push("以希望为哨兵");while(!s.isEmpty()){String str=s.pop();System.out.println(str);}}
}

/*** 将数字转化成汉字大写形式* */
public class CnNumMaker {private String integerPart;// 整数部分private String decimalPart;// 小数部分private Stack<CharPos> stack;// 存放整数部分的栈private char[] arr;// 存放万基单位的数组public CnNumMaker(String strIn) {// 分离成整数部分和小数部分if (strIn.contains(".")) {// 包含小数点int dotIndex = strIn.indexOf(".");integerPart = strIn.substring(0, dotIndex);decimalPart = strIn.substring(dotIndex + 1);} else {// 不包含小数点integerPart = strIn;}// 初始化栈int length = integerPart.length();stack = new Stack<CharPos>(CharPos.class, length);arr=new char[length];// 向栈中填值for (int i = 0; i < length; i++) {char c = integerPart.charAt(i);int pos = length - i - 1;if (c == '0') {if (stack.isEmpty()) {stack.push(new CharPos(c, pos));} else {CharPos top = stack.peek();if (top.c != '0') {stack.push(new CharPos(c, pos));}else{top = stack.pop();stack.push(new CharPos(c, pos));}}} else {stack.push(new CharPos(c, pos));}// 插入逗号,作为单位if (pos % 4 == 0 && pos != 0) {arr[pos]=',';}}// 清除尾后的零CharPos top=stack.peek();while(top.c=='0'){stack.pop();if(stack.isEmpty()==false){top=stack.peek();}else{stack.push(top);break;}}}public String toString(){StringBuilder sb=new StringBuilder();// 整数部分处理if(Long.parseLong(integerPart)==0){sb.append("零");}else{// 这个数组用来放最终汉字,小单位和大单位String[] arrStr=new String[arr.length];while(stack.isEmpty()==false){CharPos poped=stack.pop();if('0'==poped.c){arrStr[poped.pos]="零";}else{arrStr[poped.pos]=getCnUpperNumber(poped.c)+getUnit(poped.pos);}}// 万亿等单位for(int i=0;i<arr.length;i++){if(arr[i]==','){String unit=getWanUnit(i);if("零".equals(arrStr[i])){arrStr[i]=unit;}else{if(arrStr[i]==null){arrStr[i]="";}arrStr[i]+=unit;}}}// 万基单位前面三位是空的话万基单位不该出现for(int i=0;i<arrStr.length-3;i++){if(arrStr[i]!=null && arrStr[i+1]==null && arrStr[i+2]==null && arrStr[i+3]==null){arrStr[i]=null;}}// 整数部分拼接for(int i=0;i<arrStr.length;i++){if(arrStr[i]!=null ){sb.insert(0, arrStr[i]);}}}// 小数部分处理if(decimalPart!=null && decimalPart.length()>0){sb.append("点");for(int i=0;i<decimalPart.length();i++){sb.append(getCnUpperNumber(decimalPart.charAt(i)));}}return sb.toString();}// 得到数字的汉字大写private static char getCnUpperNumber(char c){final char[] Uppers = { '零', '壹', '贰', '叁', '肆', '伍', '陆','柒', '捌', '玖' };String str=String.valueOf(c);   int number=Integer.parseInt(str);return Uppers[number];}// 得到十百千这种单位private static String getUnit(int pos){final String[] Units = { "", "拾", "百", "仟"};int mod=pos%4;return Units[mod];}// 得到万亿兆这种单位private static String getWanUnit(int pos){final String[] Wans = { "", "万", "亿", "兆", "京", "垓", "秭", "穰", "沟", "涧", "正", "载"};return Wans[pos/4];}public static void main(String[] args) {//CnNumMaker c=new CnNumMaker("100000000");// c.toString();
String[] arr = {"0", "1", "10","100","1000", "10000","100000", "1000000","10000000", "100000000", "1000000000","10000000000","1000000000000", "10123", "100123","1000123", "10012003", "1234567890.043243", "567891234567890.043243" ,"3243243344567890.043243" ,"24","108","9234","9087","9008","10001","100001","10000001","1000000001","10000000001","100000000001","1000000000001","10000000000001","100000100000001","10007600089001"};for (String str : arr) {try {CnNumMaker c = new CnNumMaker(str);System.out.println(str+"->"+c.toString());} catch (Exception e) {e.printStackTrace();System.out.println("Error:" + str);}}}
}

从以下输出可以看到,这个类对于数字的汉字大写处理,已经可以了。如果你在使用中发现什么问题,请及时提醒我。

0->零
1->壹
10->壹拾
100->壹百
1000->壹仟
10000->壹万
100000->壹拾万
1000000->壹百万
10000000->壹仟万
100000000->壹亿
1000000000->壹拾亿
10000000000->壹百亿
1000000000000->壹兆
10123->壹万零壹百贰拾叁
100123->壹拾万零壹百贰拾叁
1000123->壹百万零壹百贰拾叁
10012003->壹仟零壹万贰仟零叁
1234567890.043243->壹拾贰亿叁仟肆百伍拾陆万柒仟捌百玖拾点零肆叁贰肆叁
567891234567890.043243->伍百陆拾柒兆捌仟玖百壹拾贰亿叁仟肆百伍拾陆万柒仟捌百玖拾点零肆叁贰肆叁
3243243344567890.043243->叁仟贰百肆拾叁兆贰仟肆百叁拾叁亿肆仟肆百伍拾陆万柒仟捌百玖拾点零肆叁贰肆叁
24->贰拾肆
108->壹百零捌
9234->玖仟贰百叁拾肆
9087->玖仟零捌拾柒
9008->玖仟零捌
10001->壹万零壹
100001->壹拾万零壹
10000001->壹仟万零壹
1000000001->壹拾亿零壹
10000000001->壹百亿零壹
100000000001->壹仟亿零壹
1000000000001->壹兆零壹
10000000000001->壹拾兆零壹
100000100000001->壹百兆零壹亿零壹
10007600089001->壹拾兆零柒拾陆亿零捌万玖仟零壹

转载于:https://www.cnblogs.com/xiandedanteng/p/3871018.html

爪哇国新游记之二十----将数字转换成中国汉字大写形式相关推荐

  1. 爪哇国新游记之二十六----迷宫寻路

    代码: class Position{int x;int y;public Position(int x,int y){this.x=x;this.y=y;} } // 迷宫寻路 public cla ...

  2. 爪哇国新游记之二十四----二叉树

    /*** 二叉树节点类* */ class Node<T extends Comparable> {public Node(T data){this.data=data;}T data;N ...

  3. 爪哇国新游记之二十八----从url指定的地址下载文件到本地

    package download;import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; i ...

  4. 爪哇国新游记之二十五----图及其遍历查找

    代码: import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java. ...

  5. 爪哇国新游记之二十九----访问URL获取输入流

    代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...

  6. 爪哇国新游记之二十一----快算24

    四张牌,通过四则运算得到24,一个数限用一次,快者为胜. 代码: import java.util.ArrayList; import java.util.HashSet; import java.u ...

  7. 爪哇国新游记之三十二----邮件发送

    由三个类完成任务,第一个为主,main中是用法示例. 纯邮件发送和带附件发送邮件皆可,大家请参照main函数中用法. package com.ufo.util.mail;import java.uti ...

  8. 爪哇国新游记之十五----泛型动态数组类

    import java.lang.reflect.Array;/*** 泛型动态数组类**/ public class DynamicArray<T extends Object>{pri ...

  9. 爪哇国新游记之十八----泛型栈类

    import java.lang.reflect.Array;/*** 泛型栈** @param <T>*/ public class Stack<T>{private Cla ...

  10. 爪哇国新游记之十六----泛型单链表类

    /*** 单链表节点类* @param <T>*/ class Node<T extends Object>{protected T value;protected Node ...

最新文章

  1. 刚接触机器学习这一个月我都做了什么?
  2. Spring获取属性配置
  3. 2020对于音视频行业意味着什么?
  4. 如何实现一个简单的RPC
  5. 【经典】MIT人工智能实验室: 如何做研究?
  6. linux最常用命令
  7. jq的attr、prop和data区别
  8. 【图像处理】基于matlab GUI图像处理(编辑+分析+调整+平滑+锐化+小波变换)【含Matlab源码 207期】
  9. 机器学习与数学基础知识(二)
  10. matlab干什么,matlab有什么用?
  11. SpringCloud、RabbitMQ、Websocket集群搭建以及集群通信
  12. CIM概念和总计架构
  13. 正确进入Iphone DFU模式
  14. Android 点击换头像(拍照和从相册选择)
  15. 三星对韩国意味着什么?假如三星破产了,韩国会受到什么影响?
  16. android手机导出日志adb logcat
  17. 年薪50万+的90后程序员都经历了什么?
  18. Vue+MySQL实现登录注册案例
  19. 魔百盒 修改时间服务器,魔百盒网关服务器下发超时
  20. <Java><字符串>口算练习题

热门文章

  1. HoudahSpot 6.2 for Mac文件搜索软件
  2. 如何在 Mac 上修复丢失的鼠标光标?
  3. Expression Blend4 中文
  4. linux用户和组2
  5. saltstack安装使用
  6. java容器取交集、并集、补集、差集示例
  7. dedecms漏洞getshell EXP最新可用
  8. 结构体类型指针做函数参数(C++)
  9. JVM到底怎么进行类加载器的呢?
  10. 【Oracle】Oracle通过表名查询触发器