在JSP或JVM中设置区域设置不会正确格式化数字

时间:2016-06-06 11:30:43

标签: java jsp formatting locale

简介

我有一个JSP页面,使用表示法显示对象中的数字:

${grant.project.cost}

它们以美国符号显示,其中decimal ="。"但我想要欧洲的乐谱。

我尝试使用以下方法设置语言环境:

  1. 使用<fmt:setLocale value="${myLocale}" scope="page" />
  2. 在JSP中设置区域设置
  3. 使用以下命令设置控制器的语言环境:Locale.setDefault(new Locale("el", "GR"));
  4. 使用:-Duser.language=el-GR
  5. 从jvm参数设置local

    不幸的是,数字继续以美国符号输出。 我更喜欢通过区域设置来执行此操作,以便编辑/重新表示字符串不需要转换符号。

    更新

    我添加了以下代码,并看到国家/语言已更改,但${}中的值仍为美国符号。

    <c:out value="${pageContext.request.locale.language}"/>
    

    UPDATE2

    根据以下链接,设置自定义区域设置应该会影响双值输出,但不会这样做: https://stackoverflow.com/a/5038805/1688441

    我也在控制器中尝试了这个,但我也在控制台中获得了美国符号:

        Locale.setDefault(new Locale("el", "GR"));
        System.out.println("test:"+new Double("1.2345"));
    

    输出:

    test: 1.2345
    

    相关

1 个答案:

答案 0 :(得分:1)

简介

由于我使用的是Spring MVC控制器,我最终做了以下操作。因为它有点扭曲,我概述了步骤。

  • 将您的属性添加到编辑控制器的模型
  • 添加InitBinding方法
  • 将modelAttribute添加到保存控制器方法。

编辑控制器

在我的编辑方法方法(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的实验并不起作用。

参考