数字格式化

/*
 * 功能描述:
 * 1.可以保留小数点后几位,如果不足,补0
 * 如果足,就四舍五入
 * 2.整数和小数的逗号分割
 */

 

import java.math.BigDecimal;


public class FormatNumber {

 // 不考虑2.233453E0的情况
 // 位数为负的暂时没有考虑
 public static void main(String[] args) {
//  formatNumber("");
//  formatNumber("   ");
//  formatNumber("121asdfdsaf32");
//  String str = formatNumber("12544532");
 
  // 测试为通过
//  String str = formatNumber("123456a78.1234567",0);
 
//  String str = formatNumber("12345678");
 
 
//  String str = formatNumber("12345678.1234567",4);
 
//  String str = formatNumber("12345678.1234567",10);
 
  // 位数取值为0,或输入为负数,没有判断
//  String str = formatNumber("12345678",0);
 
//  String str = formatNumber("12345678.12345",0);
//  String str = formatNumber("12345678",0);
//  String str = formatNumber("12345678",5);
 String str = formatNumber("-2.2737367544323206E-13",3);
 
  System.out.println(str);
 }
 
 public static String formatNumber(String number,int weishu){
 
  // 判断字符串是否为空
  if(number == null || (number.trim().length() == 0)){
   System.out.println("输入的数字为空,请输入数字");
   return "";
  }
 
  //  判断字符串里有除点号之外的非数字存在
  char[] strArray = number.toCharArray();

  for(int i = 0; i < strArray.length; i++){
   if((strArray[i] < '0' || strArray[i] > '9')&& (strArray[i] != '.' && strArray[i] != '-' && strArray[i] != 'E')){
    System.out.println("您输入的字符串中含有非法字符,请重新输入");
    return number;
   }else if(strArray[i] == 'E'){
    if(strArray[0] == '-'){
     number = number.substring(1,number.length());
     String numstr = orinum(number);
     numstr = "-" + numstr;
     number = numstr;
    }else{
     number = orinum(number);
    }
   
    }
  }
 
  // 判断小数位数为0的情况
  if(number.indexOf(".") != -1 && weishu == 0){
  
   int pointNumber = number.indexOf(".");
   String strFirst = number.substring(0,pointNumber);
  
   // 小数点前字符串分割
   strFirst = splitFirstNumber(strFirst);
   return strFirst;
  
  }
 
 
  // 判断没有小数点,但小数位数要求有位数的情况
  if(number.indexOf(".") == -1 && weishu != 0){
  
   number = number + ".";
   for(int i = 0; i < weishu; i++){
    number = number + "0";
   }
  
   int pointNumber = number.indexOf(".");
   String strFirst = number.substring(0,pointNumber);
   String strLast = number.substring(pointNumber + 1,number.length());
  
   // 小数点前字符串分割
   strFirst = splitFirstNumber(strFirst);
  
   // 小数点后字符串分割
   strLast = splitLastNumber(strLast);
  
   return strFirst + "." + strLast;
  
  }
 
 
 
  // 判断没有小数部分的情况
  if((number.indexOf(".") == -1) && weishu == 0){
  
   // 小数点前字符串分割
   number = splitFirstNumber(number);
   return number;
  } else {
   int pointNumber = number.indexOf(".");
   String strFirst = number.substring(0,pointNumber);
   String strLast = number.substring(pointNumber + 1,number.length());
  
   // 小数位数判断
   strLast = formatPoint(strLast,weishu);
  
   // 小数点前字符串分割
   strFirst = splitFirstNumber(strFirst);
  
   // 小数点后字符串分割
   strLast = splitLastNumber(strLast);
  
   return strFirst + "." + strLast;
  }
 }
 
 /**
  *
  * @param str 小数点前的字符串
  * @return 返回小数点前的逗号分割
  */
 public static  String splitFirstNumber(String str){
  char[] strArray = str.toCharArray();
  if(strArray[0] == '-'){
   StringBuffer strBuffer = new StringBuffer();
    strBuffer.append(str);
    strBuffer.reverse();
    str = strBuffer.toString();
    StringBuffer sb = new StringBuffer();
    for(int i = 0; i <  str.length(); i=i+3){
     if(i+3 < str.length()){
      String str1 = str.substring(i,i+3);
      sb.append(str1);
       if(i+3 == str.length() -1){
        //
       }else{
        sb.append(",");
       }
     } else {
      String str2 = str.substring(i,str.length());
      sb.append(str2);
     }
    }
    sb.reverse();
    return sb.toString();

  }else{
   StringBuffer strBuffer = new StringBuffer();
    strBuffer.append(str);
    strBuffer.reverse();
    str = strBuffer.toString();
    StringBuffer sb = new StringBuffer();
    for(int i = 0; i <  str.length(); i=i+3){
     if(i+3 < str.length()){
      String str1 = str.substring(i,i+3);
      sb.append(str1);
      sb.append(",");
     } else {
      String str2 = str.substring(i,str.length());
      sb.append(str2);
     }
    }
    sb.reverse();
    return sb.toString();
  }
 }
 
 /**
  *
  * @param str 小数点后字符串
  * @return 逗号分割后的字符串
  */
 public static String splitLastNumber(String str){
  StringBuffer sb = new StringBuffer();
  for(int i = 0; i <  str.length(); i=i+3){
   if(i+3 < str.length()){
    String str1 = str.substring(i,i+3);
    sb.append(str1);
    sb.append(",");
   } else {
    String str2 = str.substring(i,str.length());
    sb.append(str2);
   }
  }
  return sb.toString();
 }
 
 /**
  *
  * @param laststr 小数点后字符串
  * @param bitWei 截取的字符串长度
  * @return  返回小数点后应得的字符串
  */
 public static String formatPoint(String laststr,int bitWei){
  int n = laststr.length();
  if(n < bitWei){
   for(int i = 0; i < bitWei - n; i++){
    laststr = laststr + "0";
   }
  } else {
   BigDecimal bd = new BigDecimal("0." + laststr).setScale(bitWei,BigDecimal.ROUND_HALF_UP);
   laststr = bd.toString();
   laststr = laststr.substring(2,laststr.length());
  }
  return laststr;
 }
 
 // 处理科学计数法
 public static String orinum(String str){
  int index = str.indexOf("E");
  String lstr = str.substring(index + 1, str.length());
  int pindex = str.indexOf(".");
  System.out.println("pindex: " + pindex);
 
  // 取小数点后到E之间的字符串
  String  midstr = str.substring(pindex + 1,index);
 
  // 取小数点前字符
  String pstr = str.substring(0,pindex);
 
  // 判断E后数字是正还是负
  Integer e = Integer.parseInt(lstr);
  String nstr = null;
  if(e > 0){
   if(midstr.length() > e){
    nstr = pstr + midstr.substring(0,e) + "." + midstr.subSequence(e, midstr.length());
   }else{
    nstr = pstr + midstr;
    for(int i = 0; i < e  - midstr.length(); i++){
    nstr = nstr  + "0";
    }
   }
  }else{
   if(pstr.length() > -e){
    nstr = pstr.substring(0,pindex + e) + "." + pstr.substring(pindex+e,pstr.length()) + midstr;
   }else{
    nstr = pstr + midstr;
    for(int i = 0; i < -e - pstr.length(); i++){
     nstr = "0" + nstr;
    }
    nstr = "0." + nstr;
   }
  }
  return nstr;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值