格式化输出数字 有时我们需要控制输出的数字的格式如何使用java的类库做到这个呢? 也许你不关心格式但是你需要关心你的程序可以在全世界通用像下面的这样一个简单的语句是依赖地区的 Systemoutprintln(); 在美国 是小数点但在其它地方就不一定了如何处理这个呢? javatext 包中的一些包可以处理这类问题下面的简单范例使用那些类解决上面提出的问题 import javatextNumberformat; import javautilLocale; public class Decimalformat { public static void main(String args[]) { // 得到本地的缺省格式 Numberformat nf = NumberformatgetInstance(); Systemoutprintln(nfformat()); // 得到德国的格式 Numberformat nf = NumberformatgetInstance(LocaleGERMAN); Systemoutprintln(nfformat()); } } 如果你在美国运行程序后输出 换句话说在不同的地方使用不同的习惯表示数字 NumberformatgetInstance()方法返回Numberformat的一个实例(实际上是Numberformat具体的一个子类例如Decimalformat) 这适合根据本地设置格式化一个数字你也可以使用非缺省的地区设置例如德国然后格式化方法根据特定的地区规则格式化数字这个程序也可以使用一个简单的形式 NumberformatgetInstance()format() 但是保存一个格式然后重用更加有效国际化是格式化数字时的一个大问题 另一个是对格式的有效控制例如指定小数部分的位数下面是解决这个问题的一个简单例子 import javatextDecimalformat; import javautilLocale; public class Decimalformat { public static void main(String args[]) { // 得到本地的缺省格式 Decimalformat df = new Decimalformat(####); Systemoutprintln(dfformat()); // 得到德国的格式 LocalesetDefault(LocaleGERMAN); Decimalformat df = new Decimalformat(####); Systemoutprintln(dfformat()); } } 在这个例子中设置了数字的格式使用像####的符号这个模式意味着在小数点前有四个数字如果不够就空着小数点后有三位数字不足用补齐程序的输出 相似的也可以控制指数形式的格式例如 import javatextDecimalformat; public class Decimalformat { public static void main(String args[]) { Decimalformat df = new Decimalformat(E); Systemoutprintln(dfformat()); } } 输出 E 对于百分数 import javatextNumberformat; public class Decimalformat { public static void main(String args[]) { Numberformat nf = NumberformatgetPercentInstance(); Systemoutprintln(nfformat()); } } 输出 % 至此你已经看到了格式化数字的几个不同的技术另一方面如何读取并解析包含格式化的数字的字符串?解析支持包含在Numberformat中例如 import javautilLocale; import javatextNumberformat; import javatextParseException; public class Decimalformat { public static void main(String args[]) { // 本地格式 Numberformat nf = NumberformatgetInstance(); Object obj = null; // 基于格式的解析 try { obj = nfparse(); } catch (ParseException e) { Systemerrprintln(e); } Systemoutprintln(obj); // 德国格式 Numberformat nf = NumberformatgetInstance(LocaleGERMAN); Object obj = null; // 基于格式的解析 try { obj = nfparse(); } catch (ParseException e) { Systemerrprintln(e); } Systemoutprintln(obj); } } 这个例子分两部分都是解析一个字符串第一部分使用本地格式解析第二部分使用德国格式解析当程序在美国运行结果是 换句话说在美国被认为是一个巨大的整数而在德国被认为是一个小数 还有格式化讨论的最后一个问题在上面的例子中 Decimalformat 和 Numberformat 都被使用了Decimalformat 常用于获得很好的格式控制而Numberformat 常用于指定不同于本地的地区如何结合两个类呢? 答案围绕着这样的事实Decimalformat是Numberformat的一个子类其实例被指定为特定的地区因此你可以使用NumberformatgetInstance 指定一个地区然后将结构强制转换为一个Decimalformat对象文档中提到这个技术可以在大多情况下适用但是你需要用try/catch 块包围强制转换以防转换不能正常工作 (大概在非常不明显得情况下使用一个奇异的地区)下面是一个这样的例子 import javatextDecimalformat; import javatextNumberformat; import javautilLocale; public class Decimalformat { public static void main(String args[]) { Decimalformat df = null; // 得到一个Numberformat 对象并 // 强制转换为一个 Decimalformat 对象 try { df = (Decimalformat) NumberformatgetInstance(LocaleGERMAN); } catch (ClassCastException e) { Systemerrprintln(e); } // 设置格式模式 dfapplyPattern(####); // format a number Systemoutprintln(dfformat()); } } getInstance() 方法获得格式然后调用applyPattern()方法设置格式模式输出 如果你不关心国际化可以直接使用Decimalformat |