decimalformat
关于java中decimalformat()方法的调用
我们可以从各种地方知道DecimalFormat类的使用方法,它的作用是格式化数字。
在此不多赘述,博主现在是一个本科生也处于初学Java阶段,这里就讲一下关于DecimalFormat类的构造方法的发现与探索。
我分别建立了两个方法,一个用有参方法实例化对象,另一个用无参方法实例化对象。
public class DecimalFormalSimpleDemo {
static public void SimgleFormat(String pattern, double value) {
//实例化DecimalFormat对象
DecimalFormat myFormat = new DecimalFormat(pattern);
String output = myFormat.format(value);
System.out.println(value+" "+pattern+" "+output);
}
//使用APPlyPattern()方法对数字进行格式化
static public void UseApplyPatternMethodFormat(String pattern, double value) {
DecimalFormat myFormat = new DecimalFormat();
myFormat.applyPattern(pattern);
System.out.println(value+" "+pattern+" "+myFormat.format(value));
}
public static void main(String[] args) {
SimgleFormat("###,###.###", 123456.789);
SimgleFormat("00000000.###kg",123456.789);
//按照格式模版格式化数字,不存在的位以0显示
SimgleFormat("000000.000", 123.78);
//调用静态UseApplyPatternMethodFormat()方法
UseApplyPatternMethodFormat("#.###%", 0.789);
//将小数点后格式化为两位
UseApplyPatternMethodFormat("###.##", 123456.789);
//将数字转化为千分数形式
UseApplyPatternMethodFormat("0.00\u2030", 0.789);
}
}
代码运行结果如下:
前三行输出是调用有参构造方法时的输出,后三行输出是调用无参构造方法时的输出。
然后观察可发现调用无参方法的时候,如果想按照设定的格式输出格式化的数据,就必须得加上myFormat.applyPattern(pattern);
这行代码,那么是不是只要不加上这行语句,值就不会有任何格式上的变化呢?所以我就把UseApplyPatternMethodFormat方法里的myFormat.applyPattern(pattern);
去掉了,然后结果如下:
可看出倒数第二行的123456.789
变为了123,456.789
,那么这个逗号是从哪里来的呢,我们去从DecimalFormat类的无参构造方法里寻找。
DecimalFormat类的无参构造方法如下:
public DecimalFormat() {
// Get the pattern for the default locale.
Locale def = Locale.getDefault(Locale.Category.FORMAT);
LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(NumberFormatProvider.class, def);
if (!(adapter instanceof ResourceBundlebasedAdapter)) {
adapter = LocaleProviderAdapter.getResourceBundleBased();
}
String[] all = adapter.getLocaleresources(def).getNumberPatterns();
// Always applyPattern after the symbols are set
this.symbols = DecimalFormatSymbols.getInstance(def);
applyPattern(all[0], false);
}
观察可发现,这个逗号来自于Locale.Category.FORMAT
,那就再进入Locale.Category.FORMAT
里去看一下。
由图可见,我选中的内容里明确说了这个枚举的方法里会默认给出一个数字的格式。
这个格式与Object.setGruopSize(3)
的效果一样,就是3个数分一组,所以才会有那个逗号。
DecimalFormat类的有参构造方法如下:
public DecimalFormat(String pattern) {
// Always applyPattern after the symbols are set
this.symbols = DecimalFormatSymbols.getInstance(Locale.getDefault(Locale.Category.FORMAT));
applyPattern(pattern, false);
}
观察可知这里实际上也是先赋予了一只默认值再调用applyPattern()
方法把格式化的格式传进去,所以我推理这个如果没有这个applyPattern()
的调用,也会出现数字有默认格式效果,具体效果与上一样。