2013-02-14 40 views
9

Tôi gặp vấn đề khi sử dụng databinding grail tự động "ex: Test t = new Test (params)" với dấu phân cách thập phân trên trường Form kép. Sau một vài lần tìm kiếm, tôi thấy rằng nó liên quan đến Locale của trình duyệt.Grails databinding với dấu phân cách thập phân

Ví dụ: Nếu tôi nhập số có số thập phân được phân tách bằng dấu chấm '3.45', dấu chấm không hoạt động (Phần thập phân của số bị bỏ qua). Nó lưu trữ 3.0 trong cơ sở dữ liệu của tôi

Nếu tôi làm thử nghiệm tương tự nhưng sử dụng dấu phẩy '3,45' cho dấu phân cách thập phân, mọi thứ hoạt động tốt. Grails lưu trữ 3.45 trong cơ sở dữ liệu.

Vấn đề là không ai nhập số bằng dấu phân tách dấu phẩy. (thậm chí numpad nhập dấu chấm '.' khi được đặt thành fr_CA)

Tôi đã tìm thấy một số giải pháp như đăng ký trình chỉnh sửa số tùy chỉnh (hơi đau khi bạn có nhiều ứng dụng) hoặc đặt ngôn ngữ toàn cụcResolver thành en_US người ta không làm công việc vì tôi mất tất cả chức năng quốc tế hóa của ứng dụng của tôi).

Vì vậy, ai đó có giải pháp dễ dàng để khắc phục sự cố đó?

sử dụng: Grails: 2.2.0 Trình duyệt: Google Chrome (locale fr_CA)

Cảm ơn rất nhiều!

Trả lời

15

Tôi đã tìm kiếm và thử trong 2 ngày. Cuối cùng tôi đã chọn để định nghĩa một PropertyEditorRegistar tùy chỉnh. Bằng cách này, tôi có thể sửa Locale chỉ cho định dạng trường Đôi. Tuy nhiên, tôi không nghĩ rằng đó là giải pháp tốt nhất vì nó sẽ được áp dụng cho tất cả các trường Đôi của tôi. Nhưng trong thời gian đó nó thực hiện công việc khá tốt. Vì vậy, nếu ai đó có giải pháp tốt hơn, tôi sẽ rất vui khi thử nghiệm và cập nhật mã của tôi.

Vì vậy, đây là cách tôi thiết lập:

1 - Tạo một lớp groovy mới mà thực hiện PropertyEditorRegistrar (nếu bạn đã có một, chỉ cần thêm một phần của mã chứa bằng phương pháp này trong một hiện)

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- Xác định cơ quan đăng ký tùy chỉnh vào conf/mùa xuân/resources.goovy (nếu nó chưa có các khóa học)

beans = { 
    customPropertyEditorRegistrar(CustomDoubleRegistrar) 
} 

3- đó là nó, Grai ls dữ liệu tự động ràng buộc sẽ làm việc tốt

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

Đừng ngần ngại gửi giải pháp tốt hơn ... Cảm ơn

EDIT 1

Kể từ Grails 2.3 giải pháp này không còn làm việc. Nếu bạn vẫn muốn sử dụng giải pháp này, bạn phải thêm cấu hình này cho Config.groovy tập tin

grails.databinding.useSpringBinder = true

Hoặc thực hiện một trong những mới DataBinding. Tôi đã thử một vài trong số họ nhưng không có gì có vẻ để giải quyết vấn đề phân cách thập phân. Cảm ơn bạn đã đăng câu trả lời nếu bạn biết cách ...

EDIT 2

Kể từ Grails 2.4+ bạn có thể xác định ValueConverter của riêng bạn để bỏ qua xác nhận Locale cơ bản. Lưu ý rằng bạn phải xóa các thay đổi được thực hiện trong bài đăng đầu tiên và trong EDIT 1. Dưới đây là làm thế nào để thực hiện ValueConverter tùy chỉnh:

conf/mùa xuân/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

hoạt động! :), Cảm ơn nhiều! – conca

+0

tôi đang làm việc với grails 3.3.1 và giải pháp này không hoạt động cho các đối tượng lệnh của tôi. cũng @BingUsing không hoạt động. Tôi không biết tại sao họ thay đổi hành vi cũ. cái mới ghê tởm: / – pebbles

0

Tôi có cùng một vấn đề ở đây. Ví dụ: người dùng ở Đức thường sẽ nhập dấu (, dấu phẩy) làm dấu tách thập phân nhưng rõ ràng bạn không thể ngăn anh ta nhập dấu chấm thay thế;) Ngoài ra, nếu bạn điền giá trị từ Javascript thì sẽ rất khó để có được số địa phương. Vì vậy, tôi đã viết phương pháp trợ giúp nhỏ này cho bộ điều khiển. Nó có thể không bao gồm tất cả các kịch bản có thể, nhưng tôi cần nó để nhập tọa độ GPS. Vui lòng đề xuất cải tiến.

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

Sau đó gọi nó như thế này ví dụ:

def save() {   
    convertDicimalParamsToDouble(["lat", "lng"]) 
    ... 
Các vấn đề liên quan