2011-07-11 27 views
6

Bir Wicket uygulamasında, ondalık sayı metin alanım var:Bir TextField <BigDecimal>'i hem kabul edebilir hem de yapabilir misiniz? ondalık ayırıcı olarak?

 TextField<BigDecimal> f = 
    new TextField<BigDecimal>("f", new PropertyModel<BigDecimal>(model, "share")); 

Her ikisini de kabul etmek istiyorum. (nokta) ve, (virgül) ondalık ayırıcı olarak (tarayıcının yerel ayarlarının 'sine bakmadan ).

değerini gösteren değeri için, oturumun lokusu kullanılır (bizim durumumuzda "fi" (-> virgül)), fakat burada alanın giriş olarak değerini kabul ettiğiyle ilgileniyorum.

Sorum şu: TextField<String> alanını değiştirmek ve etki alanı nesnesinin türüne (BigDecimal) manuel olarak dönüştürmek zorunda mıyım? Ya da TextField<BigDecimal>'ü (örneğin, Wicket'in MinimumValidator veya RangeValidator'dan faydalanmasına imkan veren) kullanmanın bir yolu var mıdır ve hala ondalık ayırıcıları da kabul ediyor mu?

+5

olarak gösterilecektir, ancak uygulama sınıfında global Dönüştürücüler kaydedebilir. Bu nedenle, BigDecimal için kendi Dönüştürme uygulamanızı kaydedebilir ve – bert

+0

@ Robert'ın her iki çeşidini de kabul edebilirsiniz, teşekkürler! Okuma * Wicket in Action * (p 163), gerçekten de buna yaklaşmanın en iyi yolu olabilir… Bunu da bir cevap olarak yazmayı düşünün. – Jonik

+2

Sadece bir uyarı kelimesi: Bazı lokallerde, her iki karakter aynı sayıda olabilir, yani '.', binlerce ve', 'ondalık ayırıcısı olarak kullanılır. Evrensel bir numara çözümleyici istiyorsanız, kodunuzun '32.519.100,28' gibi sayıları işleyebileceğinden emin olun. – biziclop

cevap

12

@ bert adlı kullanıcının yorumuna ve Wicket in Action kitabına teşekkür ederim, işe yarayan bir yaklaşım buldum.

@Override 
protected IConverterLocator newConverterLocator() { 
    ConverterLocator converterLocator = new ConverterLocator(); 
    converterLocator.set(BigDecimal.class, new CustomBigDecimalConverter()); 
    return converterLocator; 
} 

Ve özel dönüştürücü içinde, convertToObject geçersiz gerekiyor: Uygulama sınıfında BigDecimals için özel bir dönüştürücü belirtin. NB: bizim ihtiyaçlarımız için yeterlidir; ihtiyaçlarınızı düşünün ve gerektiği şekilde uyarlayın!

public class CustomBigDecimalConverter extends BigDecimalConverter { 

    @Override 
    public BigDecimal convertToObject(String value, Locale locale) { 
     // NB: this isn't universal & your mileage problably varies! 
     // (Specifically, this breaks if '.' is used as thousands separator) 
     if ("fi".equals(locale.getLanguage())) { 
      value = value.replace('.', ','); 
     } 
     return super.convertToObject(value, locale); 
    } 
} 

Düzenleme: kapalı konu ama ben de bu belgelemek istiyoruz. 4 ondalık basamaklı bir ölçeği desteklemek için uygulamamız gerekiyordu ve özel BigDecimal dönüştürücümüz de bu sorunu çözüyor.

@Override 
    public String convertToString(Object value, Locale locale) { 
     NumberFormat fmt = getNumberFormat(locale); 
     fmt.setMaximumFractionDigits(4); // By default this is 3. 
     return fmt.format(value); 
    } 

bu özelleştirme sonrasında 2.0005 gibi bir ondalık sayı Şu anda bana belgelere sahip değil 2.0005 yerine 2.

İlgili konular