我正在寻找一种从右到左键入键盘的方法。虽然用户类型我想获得价值并进行格式化。
我正在尝试这个。
public class MoneyField extends TextField implements TextChangeListener{
private static final long serialVersionUID = 1L;
private final StringBuilder MONEY_FORMAT = new StringBuilder();
public MoneyField(){
setWidth("20%");
setValue("0,00");
setMaxLength(14);
addStyleName("numeros");
setTextChangeEventMode(TextChangeEventMode.EAGER);
addTextChangeListener(this);
selectAll();
}
@Override
public void textChange(TextChangeEvent event) {
//000.000.000,00 brazilian money format
if(!event.getText().trim().isEmpty()){
if(event.getText().length() == 2){
MONEY_FORMAT.setLength(0);
MONEY_FORMAT.append(event.getText());
MONEY_FORMAT.insert(2, ",");
}else if(event.getText().length() == 6){
MONEY_FORMAT.setLength(0);
MONEY_FORMAT.append(event.getText());
MONEY_FORMAT.insert(6, ".");
}else if(event.getText().length() == 10){
MONEY_FORMAT.setLength(0);
MONEY_FORMAT.append(event.getText());
MONEY_FORMAT.insert(10, ".");
}else{
MONEY_FORMAT.setLength(0);
MONEY_FORMAT.append(event.getText());
}
}
setValue(MONEY_FORMAT.toString());
}
}
此代码有效,但格式如下:00,000.000.000,此格式为从左到右,我希望该格式为:000.000.000,00从右到左。
我如何从右到左格式化?
答案 0 :(得分:0)
您可以使用反向方法将其反转:
MONEY_FORMAT.reverse().toString()
答案 1 :(得分:0)
您的代码在几个方面存在问题。首先,您在用户仍在键入时更改输入字段的文本。这会带来糟糕的用户体验,因为用户必须非常小心,他不会在打字时破坏您在他身上播放的数字格式。否则,您的格式化算法将会中断。
然后,您没有考虑到当文本已经有一定长度时,您从TextChangeEvent
获得的文本已被格式化。也就是说,当用户键入“10”时,您的文本字段显示“10”。然后,当用户再输入3个数字时,例如'10,123',你的算法获取该字符串并在右边添加一个小数点,产生'10,123'。这就是为什么你的数字格式颠倒了。
那就是说,你真的不应该像这样拼凑一个格式化的数字String。你的代码的读者(可能是你未来的自己)会茫然地看着你的代码并试图弄清楚你想要实现的目标。
更好的解决方案是使用java.text.NumberFormat
的实例为您进行格式化。然后,您应该不在用户键入时更改文本字段的值。最好将NumberFormat
的输出放入MoneyField旁边或下面显示的标签中。在每个TextChangeEvent
之后,您可以将当前输入文本重新提供给NumberFormat
。
作为处理货币价值的提示,您可能需要查看Joda-Money library。有很多人可以用金额做错;)