10

Double フォーム フィールドで 10 進区切り文字を使用して grail 自動データバインディング "ex: Test t = new Test(params)" を使用すると問題が発生します。いくつか検索した後、ブラウザのロケールに関連していることがわかりました。

例 : ドット「3.45」で区切られた小数で数値を入力すると、機能しません (数値の小数部分は無視されます)。データベースに 3.0 を保存します

同じテストを行うが、小数点記号にコンマ「3,45」を使用すると、すべて正常に動作します。Grails はデータベースに 3.45 を格納します。

問題は、カンマ区切りで数字を入力する人がいないことです。(fr_CA に設定すると、テンキーでもドット '.' が入力されます)

カスタム番号エディタを登録する(多くのアプリがある場合は少し面倒です)、グローバル localeResolver を en_US に設定する(アプリのすべての国際化機能を失うため、最後のものは機能しません)などの解決策をすでに見つけました。

それで、誰かがその問題を解決する簡単な解決策を持っていますか?

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

どうもありがとう!

4

3 に答える 3

16

私は2日間検索して試してきました。最後に、カスタム PropertyEditorRegistar を定義することにしました。このようにして、Double フィールド形式のロケールのみを修正できます。ただし、すべての Double フィールドに適用されるため、これが最善の解決策だとは思いません。しかし、その間、それはかなりうまく機能します。したがって、誰かがより良い解決策を持っている場合は、喜んでテストしてコードを更新します。

これが私がこれを設定する方法です:

1 - PropertyEditorRegistrar を実装する新しい groovy クラスを作成します (既にある場合は、メソッドに含まれるコードの一部を既存のものに追加するだけです)。

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/spring/resources.goovy に定義します (もちろん、まだ存在しない場合)。

beans = {
    customPropertyEditorRegistrar(CustomDoubleRegistrar)
}

3- 以上です。Grails の自動データ バインディングは問題なく動作します。

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

より良い解決策を投稿することを躊躇しないでください...ありがとう

編集1

Grails 2.3 以降、このソリューションは機能しなくなりました。このソリューションを引き続き使用する場合は、この構成をConfig.groovyファイルに追加する必要があります。

grails.databinding.useSpringBinder = true

または、新しいDataBindingのいずれかを実装します。私はそれらのいくつかを試しましたが、小数点区切りの問題を解決するものは何もないようです。方法を知っている場合は、回答を投稿していただきありがとうございます...

編集2

Grails 2.4 以降では、独自の ValueConverter を定義して、基本的な Locale 検証をバイパスできます。最初の投稿と 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
    }
}
于 2013-02-15T17:09:14.673 に答える
1

Grails 2.3+ では、デフォルトのバインダー/コンバーターを適切にオーバーライドできますが、簡単でも直感的でもありません。

ここで私の答えを参照してください: Binding real number values to Grails domain attributes (値は Dojo ウィジェットによって送信されます)

于 2014-06-18T21:29:57.363 に答える