轉換器:java.math.BigDecimal中在號碼:selectOneMenu用於
@FacesConverter("bigDecimalConverter")
public class BigDecimalConverter implements Converter {
private static final int SCALE = 2;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.isEmpty()) {
return null;
}
try {
return new BigDecimal(value);
} catch (NumberFormatException e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, null, "Message"), e);
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null) {
return "";
}
BigDecimal newValue;
if (value instanceof Long) {
newValue = BigDecimal.valueOf((Long) value);
} else if (value instanceof Double) {
newValue = BigDecimal.valueOf((Double) value);
} else if (!(value instanceof BigDecimal)) {
throw new ConverterException("Message");
} else {
newValue = (BigDecimal) value;
}
DecimalFormat formatter = (DecimalFormat) NumberFormat.getNumberInstance();
formatter.setGroupingUsed(false);
formatter.setMinimumFractionDigits(SCALE);
formatter.setMaximumFractionDigits(SCALE);
return formatter.format(newValue);
}
}
列表:
<p:selectOneMenu id="list" value="#{bean.value}">
<f:selectItems var="row" value="#{bean.list}" itemLabel="#{row}" itemValue="#{row}"/>
<f:converter converterId="bigDecimalConverter"/>
</p:selectOneMenu>
<p:message id="msg" for="list"/>
<p:commandButton value="Submit" update="list msg" actionListener="#{bean.action}"/>
託管bean由上述<p:selectOneMenu>
備份:
@ManagedBean
@ViewScoped
public class Bean implements Serializable {
private List<BigDecimal> list; // Getter only.
private BigDecimal value; // Getter & setter.
private static final long serialVersionUID = 1L;
public Bean() {}
@PostConstruct
private void init() {
list = new ArrayList<BigDecimal>(){{
add(BigDecimal.valueOf(10));
add(BigDecimal.valueOf(20.11));
add(BigDecimal.valueOf(30));
add(BigDecimal.valueOf(40));
add(BigDecimal.valueOf(50));
}};
}
public void action() {
System.out.println("action() called : " + value);
}
}
驗證消息,提交表單時出現「驗證錯誤:值無效」。在提交表單時,getAsObject()
方法不會引發異常。
如果在列表中選擇了一個類似20.11
的值,則驗證通過。看起來java.math.BigDecimal
類中的equals()
方法很腥,例如,只有當兩個對象的值和比例相等時,才考慮兩個對象相等,因此10.0 != 10.00
需要compareTo()
使它們相等。
什麼建議嗎?
除了技術問題,本身似乎沒有轉換器在這種情況下是有用的。它只適用於項目值,而不適用於項目標籤。所以最終用戶看不到它的'getAsString()'效果。 JSF內建的'BigDecimalConverter'或者''究竟有多不足? –
BalusC
該轉換器旨在用於貨幣和其他地方的分組,除了將值湊整到指定的小數位數。 – Tiny
我明白了,但是現在你所擁有的轉換器似乎只能用於輸出,而不能用於輸入。我想你會希望純輸出的情況下更好地擴展標準的'NumberConverter',以防你想要格式化默認值,而不需要一遍又一遍地重複它們。巧合的是我昨天發佈了類似的答案:http:// stackoverflow。com/questions/35180537/composite-component-with-fconvertnumber-wont-work/ – BalusC