2013-02-14 3 views
9

Çift form alanında ondalık ayırıcı ile otomatik olarak bağlanabilirlik "ex: Test t = yeni Test (params)" kullanıldığında sorun yaşıyorum. Birkaç aramadan sonra, tarayıcının Locale'ye göre olduğunu buldum.Ondalık sınırlayıcıyla veri blokları

Örnek: Eğer '3.45' bir nokta ile ayrılmış ondalık sayıları girersem işe yaramazsa (Sayının ondalık kısmı yoksayılır). Bu veritabanını

veritabanında saklar. Aynı sınamayı yapar ancak ondalık ayırıcı için virgül '3,45' kullanırsam her şey iyi çalışır. Veritabanında 3.45 mağazada saklanıyor. Sorun, hiç kimsenin virgül sınırlayıcıyla numara girmemesidir. (numpad bile bir noktaya girer.) 'fr_ca' ya ayarlandığında)

Kayıtlı özel sayı düzenleyicisi (çok sayıda uygulamanız olduğunda biraz acı) veya global localeResolver öğesini en_US (Biri benim işimi yapmıyor çünkü benim uygulamamın tüm uluslararasılaşma işlevselliğini kaybediyorum).

Yani, birisinin bu sorunu gidermek için kolay bir çözümü var mı?

kullanarak: Grails: 2.2.0 Tarayıcı: Google Chrome (yerel fr_CA)

Çok teşekkürler!

cevap

15

Aradığım ve 2 gün boyunca çalışıyorum. Sonunda özel bir PropertyEditorRegistar tanımlamayı seçtim. Bu şekilde, Locale'i yalnızca Double field formatı için düzeltebilirim. Ancak, bunun en iyi çözüm olduğunu sanmıyorum çünkü tüm Double alanlarına uygulanacak. Ama bu arada iş oldukça iyi iş yapıyor. Yani eğer birisi daha iyi bir çözüme sahipse, bunu test etmekten ve kodumu güncellemekten memnun olurum. Bunu nasıl oluşturduğuna

Yani şudur:

1 - (zaten sadece mevcut birinde yöntemle bulunan kod parçasını ekleyin varsa)

PropertyEditorRegistrar uygulayan yeni harika sınıf oluşturun (tabii zaten değilse)
import java.text.DecimalFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import org.springframework.beans.PropertyEditorRegistrar; 
import org.springframework.beans.PropertyEditorRegistry; 
import org.springframework.beans.propertyeditors.CustomNumberEditor; 

public class CustomDoubleRegistrar implements PropertyEditorRegistrar { 

    @Override 
    public void registerCustomEditors(PropertyEditorRegistry registry) { 
      //define new Double format with hardcoded Locale.ENGLISH 
     registry.registerCustomEditor(Double.class, 
       new CustomNumberEditor(Double.class, 
          DecimalFormat.getInstance(Locale.ENGLISH),true)) 
    } 

} 

2- conf/yay/resources.goovy içine var

beans = { 
    customPropertyEditorRegistrar(CustomDoubleRegistrar) 
} 

3-, GRAI özel kayıt tanımlama ls oto veri

Test t = new Test(params); 
//params contains many Double fields with dot '.' as decimal delimiter 

Grails bu çözüm artık çalışıyor 2.3 yana Edit 1

... iyi çözümler sonrası Teşekkür

çekinmeyin iyi çalışır bağlayıcı. Hala bu çözümü kullanmak istiyorsanız,

gerçek Config.groovy dosyası

grails.databinding.useSpringBinder = Bu yapılandırma eklemek Veya yeni DataBinding birini uygulamak zorunda. Onlardan az denedim ama ondalık ayırıcı sorunu çözmek için bir şey yok gibi görünüyor. Nasıl olduğunu bildiğin için cevap yazdığın için teşekkürler ...

DÜZENLEME 2

kendi ValueConverter tanımlayabilirsiniz 2.4+ Grails temel Yerel doğrulama atlamasına beri. 'un ilk gönderide ve EDIT 1'da yapılan değişiklikleri kaldırmanız gerektiğini unutmayın.

conf/bahar/resources.groovy

// Place your Spring DSL code here 
beans = { 
    "defaultGrailsjava.lang.DoubleConverter"(DoubleValueConverter) 
} 

class DoubleValueConverter implements ValueConverter { 

    public LongValueConverter() { 
    } 

    boolean canConvert(value) { 
     value instanceof Double 
    } 

    def convert(value) { 
     //In my case returning the same value did the trick but you can define 
     //custom code that takes care about comma and point delimiter... 
     return value 
    } 

    Class<?> getTargetType() { 
     return Double.class 
    } 
} 
+2

Çalışıyor! :), Çok teşekkür ederim! – conca

+0

Ben 3.3.1 grails ile çalışıyorum ve bu çözüm benim komut nesneleri için çalışmıyor. Ayrıca @BingUsing çalışmıyor. Neden eski davranışları değiştirdiklerini bilmiyorum. yeni kimse iğrenç: – pebbles

0

Burada aynı sorun var: Burada, özel ValueConverter nasıl uygulanacağı bu. Örneğin, Almanya'daki bir kullanıcı genellikle ondalık ayırıcı olarak bir virgül (virgül) girecektir, ancak açık bir şekilde onun yerine bir nokta girmesini engelleyemezsiniz.) Ayrıca, Javascript'ten değeri doldurursanız, yerelleştirilmiş bir sayı elde etmek oldukça zordur. Bu yüzden denetleyici için bu küçük yardım yöntemini yazdım. Tüm olası senaryoları kapsamayabilir ama GPS koordinatlarını girmek için ona ihtiyacım var. İyileştirmeler önermek için çekinmeyin.

/** 
    * Replaces , in the param with . an converts it to a Double. 
    * @param paramName an array of paramater names 
    */ 
    private convertDicimalParamsToDouble(paramName) { 
     paramName.each { it 
      def val = params[it] 
      if(val) { 
       val = val.replace(",", ".") 
       try { 
        params[it] = Double.parseDouble(val) 
       } catch (NumberFormatException) { 
        //ignore 
       } 
       log.debug("Converted decimal param ${it} with value '${params[it]}' to new value '${val}'") 
      } 
     } 
    } 

Sonra örneğin şöyle diyoruz: Önemsiz veya sezgisel olmasa da düzgün, varsayılan bağlayıcı/dönüştürücü geçersiz kılabilir 2.3+ Grails için

def save() {   
    convertDicimalParamsToDouble(["lat", "lng"]) 
    ...