ALL is Well!

敏捷是一条很长的路,摸索着前进着

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  30 随笔 :: 23 文章 :: 71 评论 :: 0 Trackbacks

问题
freemarker在解析数据格式的时候,默认将数字按3位来分割,例如1000被格式化为1,000,这样做看似美观,但在实际操作时候会带来问题。例如我一个页面有一个元素,该元素的值由后台绑定且超过1000,那么当我要使用这个元素的值的时候,便会出现问题。
例如,我在ftl文件中这样写:

<input type="hidden" id="testElement" name="testElement" value="${size}" />
假设后台绑定的size为1000。

然后我在js里使用这个testElement元素的值。
var t = $("#testElement");
alert(t);
alert(parseInt(t));
alert(Number(t));


得到的值是:
1,000
1
NaN

这下悲剧了,没有一个是我想要的数值类型1000,这让我情何以堪啊。

我之前有一个随笔,基于Struts2、Freemarker的分页组件实现(附工程源码) ,便因为freemarker的数字格式化问题,存在一个bug。
在数据超过1000时候,点击下一页,便会报错。原因是将1,000传到了后台,当作是总记录数,而这个值并非数值。

解决问题
* 在模板中直接加.toString()转化数字为字符串,如:${size.toString()};
* 在freemarker配置文件freemarker.properties(在类路径下即可)加<#setting number_format="#">;
* 在模板中直接加<#setting number_format="#">;
* 通过freemarker.template.Configuration的config.setNumberFormat("#")来设定freemarker对数值的格式化;

其实后三种方法的思路是一致的,只是实现方法不同而已。如果应用中已经存在了 freemarker.properties 并配置了其他的属性,可以在这里配置,否则推荐使用最后一种方法。

最后我是用最后一种方法解决的问题。分页组件上的问题也解决了。

posted on 2010-12-29 14:54 李 明 阅读(5811) 评论(6)  编辑  收藏 所属分类: Freemarker

评论

# re: freemarker数字格式化引入的问题 2010-12-29 19:50 disget
${size?c}就可以完成纯数字输出
LZ火候欠大了
多看多学习,别闭门造车
  回复  更多评论
  

# re: freemarker数字格式化引入的问题 2010-12-30 08:48 礼物
我晕,好好看看文档再说吧,这不是bug  回复  更多评论
  

# re: freemarker数字格式化引入的问题 2010-12-30 13:12 Ronaldo
回复楼上:
我有一点很奇怪了。
我有说过这是freemarker的bug吗?
我是说我自己写的东西,因为忽略了这一点,存在bug。
由于freemarker这种将数字超过3位的格式化为形如1,000的,导致了我之前的写一个分页的宏点击下一页或上一页时都会报异常。

麻烦看清楚了再评论。谢谢。  回复  更多评论
  

# re: freemarker数字格式化引入的问题 2010-12-30 13:23 Ronaldo
@disget
解决问题的方式有很多种。你说的方法也确实可行。
但这个要在每个需要的地方都要这样写才行。  回复  更多评论
  

# re: freemarker数字格式化引入的问题 2012-09-07 14:35 youke
@disget
这是个办法但是工作量太大,很是麻烦的。自己水平有限还批评别人,忒搞笑了吧  回复  更多评论
  

# re: freemarker数字格式化引入的问题 2012-09-28 10:09 礼物
@Ronaldo
“我之前有一个随笔,基于Struts2、Freemarker的分页组件实现(附工程源码) ,便因为freemarker的数字格式化问题,存在一个bug。
在数据超过1000时候,点击下一页,便会报错。原因是将1,000传到了后台,当作是总记录数,而这个值并非数值。”


针对这个问题freemarker可以使用格式化定义: <#setting number_format="0.####">  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: