JSF 2 convertNumber permille

时间:2018-01-04 09:11:05

标签: jsf number-formatting

我们有#{object.amount}等于0.003,我们希望将其显示为3‰(使用permille运算符)

我们还想将inputText的值转换为permille。 (例如:用户输入3将存储0.003)

f:convertNumber允许我们转换为类型%而不是‰:

<h:outputText value="#{object.amount}" >
    <f:convertNumber type="percent" />
</h:outputText>

我们如何在outputText中显示值permille并将值转换为inputText中的permille?

1 个答案:

答案 0 :(得分:1)

与Kukeltje建议的一样,您可以实现自定义转换器,例如:

@FacesConverter("permilleConverter")
public class PermilleConverter implements Converter {

  private static final String PERMILLE_SYMBOL = "‰";
  private static final int PERMILLE_FACTOR = 1000;

  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (value == null) {
      return null;
    }
    return getDoubleValue(value) / PERMILLE_FACTOR;
  }

  private Double getDoubleValue(String value) {
    NumberFormat nf = new DecimalFormat();
    Double doubleValue;
    try {
      Number number = nf.parse(value);
      doubleValue = number.doubleValue();
    } catch (ParseException e) {
      throw new ConverterException("no valid format");
    }
    return doubleValue;
  }

  @Override
  public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value == null) {
      return null;
    }
    double amount = (double) value;
    NumberFormat nf = new DecimalFormat();
    nf.setMaximumFractionDigits(0);
    return nf.format(amount * PERMILLE_FACTOR) + PERMILLE_SYMBOL;
  }

}

并像这样使用它:

<h:form>
    <h:outputText value="#{userBean.amount}">
        <f:converter converterId="permilleConverter" />
    </h:outputText>

    <h:inputText value="#{userBean.amount}">
        <f:converter converterId="permilleConverter" />
    </h:inputText>

    <h:commandButton value="test">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
</h:form>