java中数字格式转化

NumberFormat.getInstance()方法返回NumberFormat的一个实例(实际上是NumberFormat具体的一个子类,例如DecimalFormat),  这适合根据本地设置格式化一个数字。你也可以使用非缺省的地区设置,例如德国。然后格式化方法根据特定的地区规则格式化数字。这个程序也可以使用一个简单的形式:
NumberFormat.getInstance().format(1234.56)
但是保存一个格式然后重用更加有效。国际化是格式化数字时的一个大问题。
另一个是对格式的有效控制,例如指定小数部分的位数,下面是解决这个问题的一个简单例子:
import  java.text.DecimalFormat;
import  java.util.Locale;
public  class  DecimalFormat2  {
public  static  void  main(String  args[])  {
//  得到本地的缺省格式
DecimalFormat  df1  new  DecimalFormat("####.000");
System.out.println(df1.format(1234.56));
//  得到德国的格式
Locale.setDefault(Locale.GERMAN);
DecimalFormat  df2  new  DecimalFormat("####.000");
System.out.println(df2.format(1234.56));
}
}
在这个例子中设置了数字的格式,使用像"####.000"的符号。这个模式意味着在小数点前有四个数字,如果不够就空着,小数点后有三位数字,不足用0补齐。程序的输出:
1234.560
1234,560
相似的,也可以控制指数形式的格式,例如:
import  java.text.DecimalFormat;
public  class  DecimalFormat3  {
public  static  void  main(String  args[])  {
DecimalFormat  df  new  DecimalFormat("0.000E0000");
System.out.println(df.format(1234.56));
}
}
输出:
1.235E0003
对于百分数:
import  java.text.NumberFormat;
public  class  DecimalFormat4  {
public  static  void  main(String  args[])  {
NumberFormat  nf  NumberFormat.getPercentInstance();
System.out.println(nf.format(0.47));
}
}
输出:
47%
至此,你已经看到了格式化数字的几个不同的技术。另一方面,如何读取并解析包含格式化的数字的字符串?解析支持包含在NumberFormat中。例如:
import  java.util.Locale;
import  java.text.NumberFormat;
import  java.text.ParseException;
public  class  DecimalFormat5  {
public  static  void  main(String  args[])  {
//  本地格式
NumberFormat  nf1  NumberFormat.getInstance();
Object  obj1  null;
//  基于格式的解析
try  {
obj1  nf1.parse("1234,56");
}
catch  (ParseException  e1)  {
System.err.println(e1);
}
System.out.println(obj1);
//  德国格式
NumberFormat  nf2  =NumberFormat.getInstance(Locale.GERMAN);
Object  obj2  null;
//  基于格式的解析
try  {
obj2  nf2.parse("1234,56");
}
catch  (ParseException  e2)  {
System.err.println(e2);
}
System.out.println(obj2);
}
}
这个例子分两部分,都是解析一个字符串:"1234,56"。第一部分使用本地格式解析,第二部分使用德国格式解析。当程序在美国运行,结果是:
123456
1234.56
换句话说,"1234,56"在美国被认为是一个巨大的整数"123456"而在德国被认为是一个小数"1234.56"。
3.4.        DecimalFormat  和  NumberFormat的联系
在上面的例子中,  DecimalFormat  和  NumberFormat  都被使用了。DecimalFormat  常用于获得很好的格式控制,而NumberFormat  常用于指定不同于本地的地区。如何结合两个类呢?
答案围绕着这样的事实:DecimalFormat是NumberFormat的一个子类,其实例被指定为特定的地区。因此,你可以使用NumberFormat.getInstance  指定一个地区,然后将结构强制转换为一个DecimalFormat对象。文档中提到这个技术可以在大多情况下适用,但是你需要用try/catch  块包围强制转换以防转换不能正常工作  (大概在非常不明显得情况下使用一个奇异的地区)。下面是一个这样的例子:
import  java.text.DecimalFormat;
import  java.text.NumberFormat;
import  java.util.Locale;
public  class  DecimalFormat6  {
public  static  void  main(String  args[])  {
DecimalFormat  df  null;
//  得到一个NumberFormat  对象并
//  强制转换为一个  DecimalFormat  对象
try  {
df  (DecimalFormat)NumberFormat.getInstance(Locale.GERMAN);
}
catch  (ClassCastException  e)  {
System.err.println(e);
}
//  设置格式模式
df.applyPattern("####.00000");
//  format  number
System.out.println(df.format(1234.56));
}
}
getInstance()  方法获得格式,然后调用applyPattern()方法设置格式模式,输出:
1234,56000
如果你不关心国际化,可以直接使用DecimalFormat 
其中v  为未处理的double,scale为需求精度,返回需要小数位数的double
public  static  double  round(double  v,int  scale){
                if(scale<0){
                        throw  new  IllegalArgumentException (
                                "The  scale  must  be  positive  integer  or  zero");
                }
                BigDecimal  new  BigDecimal(Double.toString(v));
                BigDecimal  one  new  BigDecimal("1");
                return  b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

    }



[java]  view plain copy
  1. import java.text.DecimalFormat;  
  2.   
  3.   
  4. public class test {  
  5.   
  6.     /** 
  7.      * @param args 
  8.      */  
  9.     public static void main(String[] args) {  
  10.   
  11.         double d = 1231423.3823;  
  12.         System.out.println("格式化前:"+d);  
  13.         DecimalFormat f = new DecimalFormat();  
  14.           
  15.         f.applyPattern("#.##");       
  16.         System.out.println("applyPattern{#.##} 格式化后:"+f.format(d));  
  17.           
  18.         f.applyPattern("0000000000.000000");  
  19.         System.out.println("applyPattern{0000000000.000000} 格式化后:"+f.format(d));  
  20.           
  21.         f.applyPattern("-#,###.###");         
  22.         System.out.println("applyPattern{##,###.##} 格式化后:"+f.format(d));  
  23.           
  24.         f.applyPattern("0.00KG");  
  25.         System.out.println("applyPattern{0.00KG} 格式化后:"+f.format(d));  
  26.           
  27.         f.applyPattern("#000.00KG");  
  28.         System.out.println("applyPattern{#000.00KG} 格式化后:"+f.format(d));  
  29.           
  30.         f.applyPattern("0.00%");  
  31.         System.out.println("applyPattern{0.00%} 格式化后:"+f.format(d));  
  32.           
  33.         //E后面的是指数的格式 前面是底数的格式  
  34.         f.applyPattern("#.##E000");  
  35.         System.out.println("applyPattern{#.##E000} 格式化后:"+f.format(d));  
  36.           
  37.         // /u2030 表示乘以1000并表示成 ‰,放在最后  
  38.         f.applyPattern("0.00/u2030");  
  39.         System.out.println("applyPattern{0.00/u2030%} 格式化后:"+f.format(d));  
  40.     }  
  41. }  

结果

格式化前:1231423.3823
applyPattern{#.##} 格式化后:1231423.38
applyPattern{0000000000.000000} 格式化后:0001231423.382300
applyPattern{##,###.##} 格式化后:-1,231,423.382
applyPattern{0.00KG} 格式化后:1231423.38KG
applyPattern{#000.00KG} 格式化后:1231423.38KG
applyPattern{0.00%} 格式化后:123142338.23%
applyPattern{#.##E000} 格式化后:1.23E006
applyPattern{0.00‰%} 格式化后:1231423382.30‰

模式中0与# 不同

模式中的"#"表示如果该位存在字符,则显示字符,如果不存在,则不显示。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值