2014-04-28 43 views
-1

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

我正在试着这个。

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

你的代码是有问题的几个方面。首先,当用户仍在键入时,您正在更改输入字段的文本。这会造成糟糕的用户体验,因为用户必须非常小心,不要打扰他在打字时在他身上放置的数字格式。否则,你的格式化算法会中断。

然后,您不会考虑从TextChangeEvent获得的文本已经在文本已经有一定长度时被格式化。也就是说,当用户输入“10”时,您的文本字段显示为“10”。当用户再输入3个数字时,例如'10,123',你的算法使用该字符串并在右侧添加一个小数点,产生'10,123'。这就是为什么最终将数字格式颠倒过来的原因。

这就是说,你应该确实不应该拼凑一个格式化的数字字符串。你的代码的读者(这可能是你未来的自我)会茫然地盯着你的代码,并试图找出你想要达到的目标。

更好的解决方法是使用java.text.NumberFormat的实例为您进行格式设置。那么你应该而不是在用户输入时更改文本字段的值。最好将NumberFormat的输出放在MoneyField旁边或下面显示的标签中。在每个TextChangeEvent之后,您可以重新输入当前输入文本到NumberFormat

作为处理货币价值的提示,您可能需要查看Joda-Money library。有很多人可以做错钱的金额;)

+0

我使用onBlur和DecimalFormat进行了格式化。谢谢 – FernandoPaiva

0

可以使用反向方法扭转这种局面:

MONEY_FORMAT.reverse().toString() 
+0

我试图使用相反,但价值被搞砸了。例如:12,345.678.901反向到109.876.543,21 – FernandoPaiva

+0

@FernandoPaiva和你期待的结果是什么? –

+0

如果我从右到左输入数字12345678901,那么真实格式123.456.789,01你能理解我吗? – FernandoPaiva