【java】java处理随机浮点数(小数点后两位)用RMB的大写数值规则输出

简介: 晚上上床前,拿到这个有意思的问题,就想玩弄一番:============================================================================规则:【随机浮点数按照RMB读法写出】总代码如下:package com.

晚上上床前,拿到这个有意思的问题,就想玩弄一番:

============================================================================

规则:【随机浮点数按照RMB读法写出】

总代码如下:

package com.sxd.test;

import org.junit.Test;

import java.text.DecimalFormat;
import java.util.Random;

/**
 * @Author  SXD
 */
public class RandomTest {

    @Test
    public void createRandom(){
        DecimalFormat df = new DecimalFormat("0.00");
        Random random = new Random();
        double aa = (random.nextDouble())*(random.nextInt(Integer.MAX_VALUE));
        System.out.println(df.format(aa));
        System.out.println(deal4RMB(df.format(aa)));
    }

    /**
     * 从小数点为分界线,往前迭代处理+往后拼接角分+部分规则
     * @param dbNum 随机浮点数值
     * @return  转化后的RMB大写数值描述
     */
    private String deal4RMB(String dbNum){
        String sb = "";
        try {
            int point = dbNum.lastIndexOf(".");
            char [] charArr = dbNum.toCharArray();
            for (int i = 1; i <= point; i++) {
                String flag = getUpperCase(charArr[point-i],i);
                sb = flag + sb ;
                if("error".equals(flag)){
                    return  "转化异常";
                }
            }
            sb = dealString(sb);
            sb = sb+"元"+getUpperCase(charArr[point+1],-1)+getUpperCase(charArr[point+2],-2);
        }catch (Exception e){
            System.out.println(e);
            return  "转化异常";
        }
            return  sb;
    }

    /**
     * 替换中文RMB计数 + 部分规则
     * @param a 数值
     * @param i 位置
     * @return  数值+位置
     */
    private String getUpperCase(char a,int i){
        //本位值为0  并且 本位位置在个位   小数点后一位  小数点后两位
        //不做任何返回操作
        if('0' == a && (i==1 || i==-1 || i==-2)){
            return "";
        }
        //本位值为0 并且 本位位置在万位
        //仅返回 万  而不是几万
        if ('0' == a && i==5) {
            return "万";
        }

        //本位数字转化的汉字大写数字
        String flag = "";
        //本位位置对应 【分 角 个 十 百 千  万  亿】 
        String flag2 = "";
        
        switch (a){
            case '0' : flag = "零";break;
            case '1' : flag = "壹";break;
            case '2' : flag = "贰";break;
            case '3' : flag = "叁";break;
            case '4' : flag = "肆";break;
            case '5' : flag = "伍";break;
            case '6' : flag = "陆";break;
            case '7' : flag = "柒";break;
            case '8' : flag = "捌";break;
            case '9' : flag = "玖";break;

            default : flag = "error";
        }

        //本位为零  不拼接本位位置 【除万位  上方已经单独处理】
        if(!"零".equals(flag)){
            switch (i){
                case -1: flag2 = "角";break;
                case -2: flag2 = "分";break;
                case 2:
                case 6:
                case 10: flag2 = "十";break;

                case 3:
                case 7:
                case 11: flag2 = "百";break;

                case 4:
                case 8: flag2 =  "千";break;

                case 5: flag2 = "万";break;
                case 9: flag2 = "亿";break;

                default: flag2 = "";
            }
        }
        
        
        /**
         * 本处处理未完善
         *因为随机数 Integer位数达到10位以上的概率很大
         *因此处理时仅处理了 壹十贰亿几千几百万 这种情况
         *若随机数级别在十万位 依旧会出现  壹十几万几千几百
         *若随机数级别在十位   依旧会出现  壹十几点几情况
         * 
         * 若要完全处理,仅需要先判断随机数总位数,而后再判断i的值为第几位再特殊处理即可~~
         */
        if("壹".equals(flag) && "十".equals(flag2) && i == 10){
            return  flag2;
        }

        //返回 数值+位置
        return flag+flag2;
    }


    /**
     * 去除重复零  + 部分规则
     * @param rmbStr
     * @return
     */
    private String dealString(String rmbStr){
       while(rmbStr.indexOf("零零") >= 0){
           rmbStr = rmbStr.replace("零零","零");
       }
       
       //判断个位是否依旧为零 若为零  截取字符串即可
       char [] arr = rmbStr.toCharArray();
       if('零' == arr[arr.length-1]){
           rmbStr = rmbStr.substring(0,rmbStr.length()-1);
       }
       return rmbStr;
    }

}
View Code

 

效果展示:

 

相关文章
|
6月前
|
Java
Java 变量命名规则
4月更文挑战第6天
|
6月前
|
存储 Java 开发者
Java变量命名规则
Java变量命名规则
104 0
|
2月前
|
Java 程序员
java基础(5)标识符命名规则和命名规范
Java标识符命名规则包括只能使用数字、字母、下划线\_、$,且数字不能开头,不能使用关键字命名,且严格区分大小写。命名规范建议类名、接口名首字母大写,变量名、方法名首字母小写,常量名全大写。
46 2
|
2月前
|
Java
Java源文件声明规则详解
Java源文件的声明规则是编写清晰、可读且符合语法规范的Java程序的基础。这些规则包括文件名必须与公共类名相同、包声明位于文件顶部、导入声明紧跟其后、类声明需明确访问级别,并允许使用注释增强代码可读性。一个源文件可包含多个类,但只能有一个公共类。遵循这些规则有助于提升代码质量和维护性。
|
4月前
|
Java
Java中将保留四位小数的Double转换为String的方法详解
选择合适的方法,可以使代码更加简洁、高效,同时也能满足不同场景下的需求。
56 5
|
4月前
|
Java 开发者
Java实现基于清除后分配规则的垃圾回收器及其实现原理
通过上述简化模型的实现,我们可以理解基于清除后分配规则的垃圾回收器的基本工作原理。实际上,现代JVM中的垃圾回收器比这个例子复杂得多,它们可能包括更多阶段、优化策略,以及不同类型的垃圾回收器协同工作。然而,理解这一基本概念对于深入理解垃圾回收机制和内存管理非常有帮助。
23 3
|
6月前
|
存储 安全 Java
掌握8条泛型规则,打造优雅通用的Java代码
掌握8条泛型规则,打造优雅通用的Java代码
掌握8条泛型规则,打造优雅通用的Java代码
|
4月前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
45 0
|
4月前
|
监控 Java 开发者
Java面试题:解释Java内存模型中的内存顺序规则,Java中的线程组(ThreadGroup)的工作原理,Java中的FutureTask的工作原理
Java面试题:解释Java内存模型中的内存顺序规则,Java中的线程组(ThreadGroup)的工作原理,Java中的FutureTask的工作原理
27 0
|
5月前
|
Java
(JAVA) 电话、邮箱脱敏,带脱敏规则
(JAVA) 电话、邮箱脱敏,带脱敏规则
236 2