2012-01-06 9 views
15

निम्नलिखित हमेशा के रूप में आप उम्मीद करेंगे व्यवहार न करे:परीक्षण करता है, तो एक BigDecimal मूल्य एक JSP ईएल अभिव्यक्ति में शून्य है

<c:if test="${someBigDecimal == 0}"> 

someBigDecimal 0 मान है, लेकिन 0 से पैमाने अन्य है, == ऑपरेशन झूठी वापसी करता है। यही है, जब यह कुछ बिगडिसीमल नया बिगडिसीमल ("0") होता है, तो यह सच होता है, लेकिन जब कुछ बिगडिमेमल नया बिगडेसिमल ("0.00") होता है तो यह गलत होता है।

इस JSP 2.0, 2.1, और 2.2 विनिर्देशों, जो राज्य का परिणाम है:

< के लिए,>, < =,> =:

तो ए या बी BigDecimal है, मजबूर दोनों ए और बी बिगडिसीमल और A.compareTo (B) के वापसी मूल्य का उपयोग करें।

के लिए ==, =:

ए या बी BigDecimal है, तो दोनों ए और BigDecimal के लिए बी और फिर विवश:

  • तो ऑपरेटर == है, लौटने के एक .equals (बी)
  • तो ऑपरेटर है! =, वापसी! A.equals (बी)

इसका मतलब है == और != ऑपरेटरों के परिणामस्वरूप .equals() विधि पर कॉल किया गया, जो न केवल मूल्यों की तुलना करता है, बल्कि बिगडेसिमल के पैमाने की तुलना करता है। अन्य तुलना ऑपरेटर के परिणामस्वरूप .compareTo() विधि पर कॉल किया जाता है, जो केवल मूल्यों की तुलना करता है।

बेशक

, निम्नलिखित काम करेगा:

<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}"> 

लेकिन यह नहीं बल्कि बदसूरत है, वहाँ यह करने के लिए एक बेहतर तरीका है?

+3

अपने प्रश्न क्या है? – kcdragon

+0

@ user617090 बस सोच रहा है कि इससे निपटने का सबसे अच्छा तरीका क्या है। मैंने यह स्पष्ट करने के लिए प्रश्न संपादित किया है। –

+0

यदि आप '== 0.0' का उपयोग करते हैं तो क्या होता है? –

उत्तर

10

JSP 2.2 ईएल में और इस अभिव्यक्ति से ऊपर true करने का मूल्यांकन करेंगे:

${someBigDecimal.unscaledValue() == 0} 

यह परिशुद्धता के किसी भी नुकसान से बच जाएगा लेकिन मानता है कि someBigDecimal हमेशा BigDecimal प्रकार का है।

${fn:isZero(someBigDecimal)} 

समस्या के मूल है कि इस जावा कोड को false क्योंकि ZERO0 और की एक scale है का मूल्यांकन करता है:

एक custom EL function शायद ईएल के पुराने संस्करणों के लिए सबसे अच्छा तरीका है नया BigDecimal में एक गैर-शून्य पैमाने है:

BigDecimal.ZERO.setScale(3).equals(BigDecimal.ZERO) 
+0

आपके उत्तर के लिए धन्यवाद। हम अभी जेएसपी 2.1 के साथ फंस गए हैं। हमने एक कस्टम फ़ंक्शन के बारे में सोचा था, लेकिन मैं इससे बचने की उम्मीद कर रहा था। अब मैं सहमत हूं कि यह सबसे अच्छा तरीका है। –

2
ईएल के नवीनतम संस्करण के साथ

(उदाहरण के लिए बिलाव 7 द्वारा समर्थित), तुम कोशिश कर सकते हैं:

<c:if test="${someBigDecimal.doubleValue() == 0}"> 
2
<c:if test="${someBigDecimal.compareTo(BigDecimal.ZERO) == 0}"> 
+0

का स्तर होगा। मुझे लगता है कि अगर हम जेएसपी 2.2 स्पेक पर थे तो यह तरीका होगा। मेरा प्रश्न एक शाब्दिक शून्य के खिलाफ बिगडिसीमल की तुलना करने के लिए सीमित था, लेकिन यह दो बिगडिमेमल मानों की तुलना करने के लिए भी काम करेगा। –

2
<c:if test="${someBigDecimal eq 0}"> 
+1

क्या आप कह रहे हैं कि 'eq'' ==' से अलग व्यवहार करता है? क्योंकि यह मेरी समझ है कि 'eq'' == 'के लिए सिर्फ एक उपनाम है। –

+0

हाँ, वे अलग हैं। बस जावा में 'बराबर()' और '==' के बीच संबंधों की तरह। – peakmuma

+1

क्षमा करें, लेकिन 'eq'' == 'के लिए केवल एक उपनाम है; [वे अलग नहीं हैं] (http://stackoverflow.com/questions/2087721/difference-between-eq-and-in-jsp)। –

0

आप पासवर्ड समारोह की कोशिश कर सकते हैं:

<c:if test="#{someBigDecimal.signum() == 0}"> 
संबंधित मुद्दे