显示现象
数据类型
实体类中为 private Double tradeAmount;
Oracle数据库中为 NUMBER(19,4)
解决方式
第一种解决方式 - 无效
将Double转为String,(String.valueOf(double)方法, 也可以用最笨的方法,就是直接+;如:String str = ""+double;)
第二种解决方式 - 引起一系列问题
将实体类中的Double修改为BigDecimal
使用SQL查询时是正常的, 但是使用HQL查询异常(hibernate expected type: java.math.BigDecimal, actual value: java.lang.Double)
原因: SQL查询可以设置返回值的类型, 强转为实体类时一一对应; HQL是默认转换, 暂时没有找到相关处理方式
第三种方式 - 完美解决(未避免异常,下面代码中需要做非空的判断)
使用DecimalFormat将Double格式化为String
public static void main(String[] args) { Double tradeAmount = 11111111111110.1050001; DecimalFormat df = new DecimalFormat("#,##0.00"); //11,111,111,111,110.11 String tradeAmountStr = df.format(tradeAmount ); }
public void setTradeAmount(Double tradeAmount) { DecimalFormat df = new DecimalFormat("#.###"); this.tradeAmountStr = df.format(tradeAmount); this.tradeAmount = tradeAmount; }
设置千分符
(转)java DecimalFormat用法
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。
DecimalFormat 包含一个模式 和一组符号
符号含义:
0 一个数字
# 一个数字,不包括 0
. 小数的分隔符的占位符
, 分组分隔符的占位符
; 分隔格式。
- 缺省负数前缀。
% 乘以 100 和作为百分比显示
? 乘以 1000 和作为千进制货币符显示;用货币符号代替;如果双写,用
国际货币符号代替。如果出现在一个模式中,用货币十进制分隔符代
替十进制分隔符。
X 前缀或后缀中使用的任何其它字符,用来引用前缀或后缀中的特殊字符。
例子:
DecimalFormat df1 = new DecimalFormat("0.0");
DecimalFormat df2 = new DecimalFormat("#.#");
DecimalFormat df3 = new DecimalFormat("000.000");
DecimalFormat df4 = new DecimalFormat("###.###");
System.out.println(df1.format(12.34));
System.out.println(df2.format(12.34));
System.out.println(df3.format(12.34));
System.out.println(df4.format(12.34));
结果:
12.3
12.3
012.340
12.34
DecimalFormat df = new DecimalFormat(); double data = 1234.56789; System.out.println("格式化之前的数字: " + data); String style = "0.0";//定义要显示的数字的格式 df.applyPattern(style);// 将格式应用于格式化器 System.out.println("采用style: " + style + " 格式化之后: " + df.format(data)); style = "00000.000 kg";//在格式后添加诸如单位等字符 df.applyPattern(style); System.out.println("采用style: " + style + " 格式化之后: " + df.format(data)); // 模式中的"#"表示如果该位存在字符,则显示字符,如果不存在,则不显示。 style = "##000.000 kg"; df.applyPattern(style); System.out.println("采用style: " + style + " 格式化之后: " + df.format(data)); // 模式中的"-"表示输出为负数,要放在最前面 style = "-000.000"; df.applyPattern(style); System.out.println("采用style: " + style + " 格式化之后: " + df.format(data)); // 模式中的","在数字中添加逗号,方便读数字 style = "-0,000.0#"; df.applyPattern(style); System.out.println("采用style: " + style + " 格式化之后: " + df.format(data)); // 模式中的"E"表示输出为指数,"E"之前的字符串是底数的格式, // "E"之后的是字符串是指数的格式 style = "0.00E000"; df.applyPattern(style); System.out.println("采用style: " + style + " 格式化之后: " + df.format(data)); // 模式中的"%"表示乘以100并显示为百分数,要放在最后。 style = "0.00%"; df.applyPattern(style); System.out.println("采用style: " + style + " 格式化之后: " + df.format(data)); // 模式中的"u2030"表示乘以1000并显示为千分数,要放在最后。 style = "0.00u2030"; //在构造函数中设置数字格式 DecimalFormat df1 = new DecimalFormat(style); //df.applyPattern(style); System.out.println("采用style: " + style + " 格式化之后: " + df1.format(data));
格式化之前的数字: 1234.56789
采用style: 0.0 格式化之后: 1234.6
采用style: 00000.000 kg 格式化之后: 01234.568 kg
采用style: ##000.000 kg 格式化之后: 1234.568 kg
采用style: -000.000 格式化之后: -1234.568
采用style: -0,000.0# 格式化之后: -1,234.57
采用style: 0.00E000 格式化之后: 1.23E003
采用style: 0.00% 格式化之后: 123456.79%
采用style: 0.00‰ 格式化之后: 1234567.89‰