#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();
}
}