我有一个JSP页面,使用表示法显示对象中的数字:
${grant.project.cost}
它们以美国符号显示,其中decimal ="。"但我想要欧洲的乐谱。
我尝试使用以下方法设置语言环境:
<fmt:setLocale value="${myLocale}" scope="page" />
Locale.setDefault(new Locale("el", "GR"));
-Duser.language=el-GR
不幸的是,数字继续以美国符号输出。 我更喜欢通过区域设置来执行此操作,以便编辑/重新表示字符串不需要转换符号。
我添加了以下代码,并看到国家/语言已更改,但${}
中的值仍为美国符号。
<c:out value="${pageContext.request.locale.language}"/>
根据以下链接,设置自定义区域设置应该会影响双值输出,但不会这样做: https://stackoverflow.com/a/5038805/1688441
我也在控制器中尝试了这个,但我也在控制台中获得了美国符号:
Locale.setDefault(new Locale("el", "GR"));
System.out.println("test:"+new Double("1.2345"));
输出:
test: 1.2345
答案 0 :(得分:1)
由于我使用的是Spring MVC控制器,我最终做了以下操作。因为它有点扭曲,我概述了步骤。
在我的编辑方法方法(RequestMapping)中,我添加了包含Double值的实体,并且我希望它们的格式不同:
model.addAttribute("grant", grant);
下面我添加了为模型的每个Attibute对象执行的以下Binder
:
@InitBinder("grant")
public void registrarInitBinder(HttpServletRequest request, ServletRequestDataBinder binder) { // register or save
NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;
df.setMinimumFractionDigits(2);
binder.registerCustomEditor(Double.class, new CustomNumberEditor(Double.class,df, true));
}
这正确地处理了grant和project中包含的Double对象。我的印象是,只有path=
映射的参数才能正常工作并且格式正确。
在我的Save
方法(requestMapping)中,我添加了grant
@RequestMapping(value = "/selection/save", method = RequestMethod.POST)
public String selectionSave(
Model model,
@RequestParam(value = "type", required = false) String type,
@Valid @ModelAttribute(value = "grant") GrantEntity grant,
BindingResult bindingResult,
HttpServletRequest request) throws ParseException
使用这些步骤,您的对象将被格式化并正确显示,并在编辑时正确解析。
不幸的是,对于位于更复杂结构中的对象(对象内的对象,例如列表或地图),我最终使用HttpServletRequest request
对象并从请求中提取它们。这是因为只对我的对象的实际双字段进行了格式化,而不是对象内的对象的双字段或对象的映射中的对象。
对于查看/编辑和保存,我创建了使用NumberFormatter的自定义方法。
<强>查看:强>
public static Double parseFormattedDouble(String value) throws ParseException {
nfStatic.setMinimumFractionDigits(2);
return nfStatic.parse(value).doubleValue();
}
在POST请求后解析(保存):
updateFundB = request.getParameter("FundB4");
Double fundB4 = FormattedDoubleAmount.parseFormattedDouble(updateFundB != null && !updateFundB.equals("") ? updateFundB : "0");
saveEntity.updateFundB4(fundB4);
我本来希望使用绑定方法来处理所有事情,但我对Collections的实验并不起作用。