规范化货币(java)-exam2

#java

#栈的使用

货币数值的规范化是金融公司的一个问题,现在你需要写一个程序来解决这一问题:

1.货币数值的整数部分要求每3位加一个英文逗号','(不含引号)。例如12345678应该规范化为12,345,678

2.货币数值最多只有两位小数,如果有多余的小数位数应当舍去。注意,不是四舍五入。

3.负数代表欠款,在规范化后应当在数值两端加上括号 '('  ')' ,然后省略掉负号。

4.应当在数值前面,前括号后面(如果有括号的话)加上金钱符号'$'(不含引号)

现在给你一个数字,请你规范化这一数字

public class exam2 {
    public static String normal(String num){
        Stack<Character> add=new Stack<Character>();        //输入栈
        Stack<Character> out=new Stack<Character>();        //输出栈
        int fflag=0;                                        //负数标志
        if (num.charAt(0)=='-')     fflag=1;
        int dflag=0;                                        //小数点标志
        int dnum=0;                                         //小数点前or后数字个数
        for(int i=0;i<num.length();i++){
            if (dflag==1)           dnum++;                 //小数点后数字个数
            if(num.charAt(i)=='.')  dflag=1;
            add.push(num.charAt(i));
//            System.out.print(add.peek());
            if(dnum==2)             break;                  //小数点后两位都存入输出栈,停止
        }
//        System.out.println();
//        System.out.println("负数:"+fflag+" 小数点:"+dflag+"小数点后位数:"+dnum);

        if (dnum==0){                                       //补齐小数点后两位,负数情况下,最后为)
            if (fflag==1)   out.push(')');
            out.push('0');
            out.push('0');
            out.push('.');
        }
        else if (dnum==1){
            if (fflag==1)   out.push(')');
            out.push('0');
        }
        else {
            if (fflag==1)   out.push(')');
        }
        dflag=0;dnum=0;
        int stksize=add.size();                         //栈的大小随着pop和push操作改变,提前保存
        for(int i=0;i<stksize;i++){
            char obj=add.pop();
            if(dflag==1){                               //判断小数点前数字个数,逢三加,
                if(dnum==3){
                    out.push(',');
                    dnum=0;
                }
                else{
                    dnum++;
                }
            }
            if(obj=='.'){
                dflag=1;
            }
            out.push(obj);
        }
        if (fflag==1){                                  //负数需要去掉负号加上(
            out.pop();
            out.push('$');
            out.push('(');
        }
        else
            out.push('$');
        String str="";
//        for (char a:out ) {
//            System.out.print(a);
//        }
//        System.out.println();
        stksize=out.size();
        for(int i=0;i<stksize;i++){
            str+=out.pop();
        }
        return str;
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        System.out.print("输入待规划个数:");
        int num=sc.nextInt();
        String[] str=new String[num];
        sc=new Scanner(System.in);
        for(int i=0;i<num;i++){
            str[i]=sc.nextLine();
//            System.out.println(str[i]);
        }
        sc.close();
        for(int i=0;i<num;i++){
            System.out.print("输入:"+str[i]+"\t\t");
            System.out.println("输出:"+normal(str[i]));
        }

        sc.close();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41940001/article/details/105718953
今日推荐