键盘从右到左键入?

时间:2014-04-28 17:32:54

标签: java vaadin7

我正在寻找一种从右到左键入键盘的方法。虽然用户类型我想获得价值并进行格式化。

我正在尝试这个。

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从右到左。

我如何从右到左格式化?

2 个答案:

答案 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。有很多人可以用金额做错;)