2013-02-14 10 views
9

私は聖杯自動データバインディングを使用する場合、私は問題を抱えている:ダブルフォームフィールドの小数点区切り文字で「EXテストtは=新しいテスト(のparamsを)」。いくつかの検索の後、私はそれがブラウザのロケールに相対的であることが分かった。Grailsのデータバインディング

例: 小数点をドット「3.45」で区切って数値を入力すると、機能しません(数値の小数部分は無視されます)。それは私が同じテストを行う場合には、私のデータベース

に3.0を格納しますが、小数点区切りのためにコンマ「3,45」を使用して、すべてが正常に動作します。 Grailsはデータベースに3.45を格納します。

問題は、誰もがカンマ区切りで番号を入力しないことです。 (数字の数字でもfr_CAに設定するとドット '。'を入力します)

私はすでにカスタム番号エディタを登録しています(アプリがたくさんある場合は少し苦労します)か、グローバルなlocaleResolverをen_US私は私のアプリケーションのすべての国際化機能を失うため、仕事をしません)。

だから、誰かがその問題を解決する簡単な解決策がありますか?

使用: Grailsの:2.2.0 ブラウザ:Google Chromeの(ロケールfr_CAと)

おかげでたくさん!

答えて

15

私は検索して2日間試しています。最終的にカスタムPropertyEditorRegistarを定義することにしました。このようにして、私はロケールをDoubleフィールド形式でのみ修正できます。しかし、私はすべての私のダブルフィールドに適用されるので、それが最善の解決策だとは思わない。しかし、その間、仕事はかなりうまくいく。だから誰かがより良い解決策を持っているなら、私はそれをテストして自分のコードを更新してうれしいです。

だからこれは私がこれを設定する方法である:

1 - (あなたが既に持っている場合は、単に既存の方法に含まれるコードの一部を追加し、)PropertyEditorRegistrarを実装する新しいグルーヴィーなクラスを作成します

(それはもちろん、すでに存在しない場合)
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に/春/ resources.goovyにそれをだ

beans = { 
    customPropertyEditorRegistrar(CustomDoubleRegistrar) 
} 

3-、GRAIをカスタムレジストラを定義しますLS自動データバインディングは

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

罰金に動作します おかげ

...より良い解決策を投稿するこのソリューションは、もはや働いているのGrails 2.3のでEDIT 1

を躊躇しないでください。それでも、このソリューションを使用する場合は、

Config.groovyファイル

grails.databinding.useSpringBinder =にこの設定を追加するか、新しいDataBindingのいずれかを実装する必要があります。私はそれらのいくつかを試したが、何も10進区切り文字の問題を解決するようだ。あなたがどのように知っていれば答えを投稿してください...

EDIT 2

独自のValueConverterを定義することができ2.4+ Grailsのが基本的なロケールの検証をバイパスするので。 の場合、最初の投稿とEDIT 1の変更を削除する必要があります。ここでは、カスタムValueConverterを実装する方法は次のとおりです。

のconf /春/ 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

は、ここに私の答えを参照してください! :)、 どうもありがとうございました! – conca

+0

私はgrails 3.3.1で作業していますが、この解決法は私のコマンドオブジェクトでは機能しません。また、@ BingUsing doesntの仕事。私は彼らがなぜ古い行動を変えるのか分からない。新しいものはうんざりです:/ – pebbles

0

私はここに同じ問題を抱えています。たとえば、ドイツのユーザーは通常小数点区切り文字として(カンマ)を入力しますが、代わりにドットを入力できないようにすることはできません。)また、Javascriptから値を入力すると、ローカライズされた数値を取得することは非常に困難です。だから私はコントローラーのこの小さなヘルパーメソッドを書いた。可能性のあるすべてのシナリオをカバーしているわけではありませんが、私はGPS座標を入力するために必要です。お気軽に改善を提案してください。

/** 
    * 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}'") 
      } 
     } 
    } 

そこで例えば、このようにそれを呼び出す:それは些細なか直感的ではありませんが、あなたは正しく、既定のバインダ/ Aコンバータを上書きすることができ2.3+ Grailsのために

def save() {   
    convertDicimalParamsToDouble(["lat", "lng"]) 
    ... 
関連する問題