2010-01-21 32 views
5

Tôi có một lĩnh vực trong đối tượng tên miền của tôi mà tôi xác định như một Integer ...Làm cách nào để thay đổi cách GRAILS GSP fieldValue định dạng Số nguyên?

Integer minPrice 

sau đó tôi truy cập vào nó trong một trang GSP như sau:

${fieldValue(bean: myBean, field: 'minPrice')} 

và những gì tôi nhận được trong tôi HTML là ...

100,000 

không phải là số nguyên, đó là chuỗi. Tệ hơn nữa nó vẫn là một String được định dạng trong một miền địa phương cụ thể. Đây là một vấn đề bởi vì tôi có một điều khiển SELECT trên một MẪU HTML trong đó có một (không thứ tự) phạm vi giá trị cho minPrice mà tôi muốn lưu trữ trong đối tượng tên miền của tôi như là số nguyên, và tôi không muốn lưu trữ một chỉ mục vào một số mảng các giá trị mà tôi phải liên tục ánh xạ qua lại giữa, tôi muốn chính giá trị đó.

chọn kiểm soát của tôi trông như thế này ...

<g:select name="minPrice" 
value="${fieldValue(bean: personInstance, field: 'minPrice')}" 
onchange="setDirty()" 
noSelection='${['0':'Select a number...']}' 
from="${[ 
    ['name':'100,000', 'id':100000], 
    ['name':'200,000', 'id':200000], 
    ['name':'300,000', 'id':300000] 
    ]}" 
optionKey="id" optionValue="name" 
/> 

Khi tôi nhận được giá trị từ các lĩnh vực SELECT để gửi lại cho máy chủ nó một cách chính xác có giá trị Integer, mà tôi vẫn tồn tại. Tuy nhiên, chuyến đi khứ hồi không bao giờ chọn trước hàng phải trong trình đơn thả xuống vì giá trị là chuỗi được phân cách bằng dấu phẩy này.

Điều này hoạt động tốt ở nơi khác trong mã của tôi đối với các số nhỏ nơi định dạng dấu phẩy không được phát, và chuyến đi khứ hồi vào và ra khỏi SELECT thành công. Nhưng giá trị> 999 không hoạt động.

Tài liệu nói "Thẻ này sẽ kiểm tra một bean đã là chủ đề của ràng buộc dữ liệu và thu được giá trị của trường từ giá trị được gửi ban đầu chứa trong đối tượng lỗi của bean trong quá trình liên kết dữ liệu hoặc từ giá trị của một thuộc tính của bean. Một khi giá trị thu được, nó sẽ được mã hóa HTML tự động. "

Đó là bit cuối cùng mà tôi muốn tránh khi có vẻ như định dạng Số nguyên. Vậy, tôi cần biết chút gì về ma thuật Grails/GSP để tôi có thể lấy Integer của mình để được hiển thị như một số nguyên trong SELECT và chọn trước hàng phải không?

EDIT: Tôi đã thử một số điều hơn nữa dựa trên các câu trả lời dưới đây, với kết quả khá thất vọng cho đến nay ...

Nếu tôi đặt thẻ <gformatNumber/> trong <g:select/> tôi lấy mã trang dưới dạng văn bản trong trình duyệt.

<g:select name="minPrice" 
value='<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />' 
onchange="setDirty()" 
noSelection='${['0':'Select a number...']}' 
from="${[ 
['name':'100,000', 'id':100000], 
['name':'200,000', 'id':200000], 
['name':'300,000', 'id':300000], 
]}" 
optionKey="id" optionValue="name" 
/> 

Sử dụng thẻ định dạng số từ GSP trên giá trị Integer của tôi về 100000 như thế này ...

var x = <g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />; 

cho 100. Hãy nhớ rằng fieldValue trả lại 100,000, vì vậy đây không phải là một bất ngờ.

Nếu tôi sử dụng taglib jsp như thế này ...

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 
var y = <fmt:formatNumber value="${fieldValue(bean: personInstance, field: 'minPrice')}" pattern=".00"/>; 

tôi nhận được một lỗi từ trình biên dịch trang Cannot format given Object as a Number.

Tôi đoán tôi có mối quan tâm rộng hơn có vẻ như không nhận được giá trị Integer làm số nguyên chính vào mã của tôi nếu nó lớn hơn 999 vì hành vi mặc định (và không thể định cấu hình) của chỉ thị fieldValue. Tuy nhiên vấn đề cụ thể của tôi về việc không thể chọn trước một giá trị Integer trong một điều khiển SELECT sẽ không biến mất. Tại thời điểm này tôi đang ở một chút mất mát.

Bất kỳ ai có thêm ý tưởng nào?

Trả lời

5

Tôi nghĩ bạn có ít nhất hai giải pháp khả thi.

Một là sử dụng thẻ tag JSTL như được mô tả trong docs.

Cách khác, thú vị hơn là sử dụng thẻ 'formatNumber' đi kèm với grails - cũng trong số docs.

Đối với mục đích của bạn, việc sử dụng thẻ mà có thể trông như thế này:

<g:formatNumber number="${fieldValue(bean: myBean, field: 'minPrice')}" format="######" /> 
+0

Tôi không thể thực hiện một trong các giải pháp này ... xem chỉnh sửa ở trên. Nhìn lại nó là hiển nhiên, nếu đây là Java đơn giản, tôi sẽ không cần một trình định dạng số, tôi sẽ cần Integer.parseInt() để lấy kết quả từ fieldValue trở lại đúng loại. Điều này không thể là khó khăn này ... tôi đang làm gì sai. – Simon

0

tôi có một giải pháp/công việc quanh ... Câu trả lời có vẻ là, "không làm gì cả".

Thay vì cố phân tích cú pháp số đã xâu thành số nguyên, tôi để nó dưới dạng chuỗi được định dạng cho mục đích chọn. Điều này có nghĩa tôi đã phải thay đổi from giá trị của tôi như sau:

<g:select name="minPrice" 
value="${fieldValue(bean: personInstance, field: 'minPrice')}" 
onchange="setDirty()" 
noSelection='${['0':'Select a number...']}' 
from="${[ 
    ['name':'100,000', 'id':'100,000'], 
    ['name':'200,000', 'id':'200,000'], 
    ['name':'300,000', 'id':'300,000'] 
    ]}" 
optionKey="id" optionValue="name" 
/> 

Tất nhiên khi tôi gửi lại cho máy chủ giá trị đó được gửi là "100.000" như một chuỗi thoát. Những gì tôi nhận ra là Grails, hoặc Spring, hoặc Hibernate, hoặc một cái gì đó trong stack, sẽ làm cho sự kết hợp của String trở lại vào kiểu Integer bên phải trước khi persistence.

Điều này hoạt động tốt cho mục đích của tôi, tuy nhiên tôi nghĩ rằng đó là cơ bản một vòng làm việc chứ không phải là một giải pháp vì vấn đề địa phương. Nếu dấu phân cách nghìn của tôi là "." và dấu phân cách thập phân của tôi là ",", nó dành cho phần lớn châu Âu, sau đó mã của tôi sẽ không hoạt động.

3

Sử dụng tốt hơn custom PropertyEditor để không bận tâm với thẻ formatNumber mỗi khi bạn xuất một giá trị. Giống như, tuyên bố một bean trong resources.groovy:

myOwnCustomEditorRegistrar(CustomEditorRegistrar) 

Và tạo lớp học của bạn:

class CustomEditorRegistrar implements PropertyEditorRegistrar { 
    void registerCustomEditors(PropertyEditorRegistry registry) { 
     registry.registerCustomEditor(BigDecimal.class, new MyBigDecimalEditor(BigDecimal.class)) 
    } 
} 
+0

cũng xem nhận xét cuối cùng trên trang này http://grails.1312388.n4.nabble.com/Changing-Number-Formating-td1379022.html – 10GritSandpaper

7

Bạn có muốn để hiển thị các số liệu? như 100000?

Bạn có thể nhận các lĩnh vực trực tiếp:

${myBean.minPrice} 
+0

Tôi sẽ cung cấp cho bạn 10 phiếu bầu nếu tôi có thể. Đơn giản là luôn luôn tốt nhất. –

+3

nếu bạn hiển thị trực tiếp bằng $ {bean.value} - bạn mất khả năng hiển thị các giá trị không vượt qua xác thực! –

1

Thay đổi

var x = <g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />; 

để

var x = <g:formatNumber number="${personInstance.minPrice}" format="#" />; 
3

Sử dụng 'groupingUsed' thuộc tính kết hợp với định dạng của bạn:

<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" 
       format="#" 
       groupingUsed="true" /> 
0

Tôi tìm thấy cách tốt nhất để xử lý việc này là làm những gì Victor Sergienko (u btw) ám chỉ bằng cách sử dụng PropertyEditor.

Tạo một biên tập viên cho Integer, đặt trong src/groovy:

class IntegerEditor extends PropertyEditorSupport { 
    void setAsText(String s) { 
     if (s) value = s as Integer 
    } 

    public String getAsText() { 
     value 
    } 
} 

và đăng ký nó sử dụng một PropertyEditorRegistrar (cũng trong src/groovy):

class MyEditorRegistrar implements PropertyEditorRegistrar { 
    public void registerCustomEditors(PropertyEditorRegistry reg) { 
     reg.registerCustomEditor(Integer, new IntegerEditor()) 
    } 
} 

thêm đăng ký của bạn vào mùa xuân config (grails-app/conf/spring/resource.groovy):

beans = { 
    customEditorRegistrar(MyEditorRegistrar) 
} 

Từ giờ trở đi ers bị ràng buộc, nhận lỗi (hoặc không) và sau đó được hiển thị lại với thẻ fieldValue sẽ được hiển thị theo mặc định của ToString của Integer - bạn có thể tùy chỉnh hành vi này trong trình chỉnh sửa bằng cách sửa đổi triển khai getAsText.

Cá nhân tôi sẽ tạo trình bao bọc cho loại điều này để bạn có thể thiết lập trình chỉnh sửa chỉ cho loại đó thay vì trên bảng cho loại được sử dụng thường xuyên. Mặc dù tôi nhận ra điều này có nghĩa là một chút ánh xạ khi kiên trì với DB ...

0
Use like this : 
<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" 
format="#.##"/>; 
Các vấn đề liên quan