2011-01-18 24 views
20

मैं स्ट्रिंग से अग्रणी सफेद जगहों को ट्रिम करने की कोशिश कर रहा हूं और मुझे नहीं पता कि मेरे दृष्टिकोण में क्या गलत है, किसी भी सुझाव की सराहना की जाएगी?क्यों ट्रिम काम नहीं कर रहा है?

कोड:

this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim();

के रूप में "IG078565 और IG083060" csv फ़ाइल और उत्पादन से poNumber पढ़ रहा हूँ भी एक ही व्हाइटस्पेस के साथ एक ही मूल्य मिल रहा है, नहीं यकीन है कि क्यों?

अपडेट किया गया

बेहतर संदर्भ के लिए पूर्ण विधि जोड़ना:

public BillingDTO(String currency, String migrationId, String chargeId, String priceId, String poNumber, String otc, 
      String billingClassId, String laborOnly) { 
     super(); 
     this.currency = currency.equals("") ? currency : currency.trim(); 
     this.migrationId = migrationId.equals("") ? migrationId : migrationId.trim(); 
     this.chargeId = chargeId.equals("") ? chargeId : chargeId.trim(); 
     this.priceId = priceId.equals("") ? priceId : priceId.trim(); 
     this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim(); 
      //poNumber.trim(); 
     //System.out.println("poNumber:"+this.poNumber.trim()); 
     //this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim(); 
     this.otc = otc.equals("") ? otc : otc.trim(); 
     this.billingClassId = billingClassId.equals("") ? billingClassId : billingClassId.trim(); 
     this.laborOnly = laborOnly.equals("") ? "N" : laborOnly; 
    } 

धन्यवाद।

+1

आप कोड को क्या करने की उम्मीद कर रहे हैं और इसके बजाय यह क्या करता है? –

+0

स्ट्रिंग # ट्रिम() मूल स्ट्रिंग देता है अगर इसे खाली स्ट्रिंग दी जाती है, तो मुझे यकीन नहीं है कि टर्नरी सशर्त भी आवश्यक है ... कोई मुझे बताना चाहता है कि मैं गलत हूं? –

+0

@ माइकल: कोड को जांचना चाहिए कि क्या मान शून्य है या नहीं, क्योंकि यह डीबी में है और यदि यह शून्य नहीं है तो इसे अग्रणी और पिछली जगहों को हटा देना चाहिए और फिर डालना चाहिए। – Rachel

उत्तर

45

अद्यतन ऐसा लगता है कि आपका व्हाइटस्पेस एक व्हाइटस्पेस (ascii = 32) नहीं है। आपका कोड 160 के साथ है, जो एक ब्रेकिंग स्पेस है। trim() इसे संभाल नहीं करता है। तो अगर आप कुछ इस तरह करना चाहिए:

this.poNumber = poNumber.replace(String.valueOf((char) 160), " ").trim(); 

बेहतर होगा कि तुम एक उपयोगिता बनाने चाहते हैं - YourStringUtils.trim(string) और दो आपरेशन वहाँ प्रदर्शन - दोनों .trim() और replace(..)


मूल जवाब:

बस this.poNumber = poNumber.trim();

का उपयोग करें यदि थर्म ई poNumbernull होने की संभावना है, तो आप commons-lang से शून्य-सुरक्षित this.poNumber = StringUtils.trim(poNumber); का उपयोग कर सकते हैं।

यदि आप null को खाली स्ट्रिंग में परिवर्तित करने के लिए चाहते हैं, तो आप उसी श्रेणी से trimToEmpty(..) का भी उपयोग कर सकते हैं।

आप पर कॉमन्स-लैंग भरोसा करने के लिए नहीं करना चाहते हैं, तो बस एक अगर-खंड जोड़ें:

if (poNumber != null) { 
    this.poNumber = poNumber.trim(); 
} 

प्रश्न के अंतर्गत टिप्पणी में बताया गया है - सुनिश्चित करें कि आप के बाद सही चर जाँच कर रहे हैं बनाने के ट्रिमिंग आपको आवृत्ति चर जांचना चाहिए। आपका पैरामीटर (या स्थानीय चर, मैं नहीं बता सकता) बदलता नहीं है, क्योंकि तार अपरिवर्तनीय हैं।

+0

यह त्रुटि देगा क्योंकि सीएसवी फ़ाइल में poNumber शून्य हो सकता है। – Rachel

+1

@ राहेल - मैंने 'शून्य 'के बारे में एक अपडेट जोड़ा। और आपका कोड शून्य – Bozho

+0

@Rachel भी देगा आपका मूल कोड एक ही त्रुटि देगा। आप किसी अन्य भाषा के साथ जावा को भ्रमित कर सकते हैं। –

3

क्या आप वाकई अपने आउटपुट के लिए सही चर पढ़ रहे हैं? आपके पास 'poNumber' है, जो मूल अनियमित स्ट्रिंग है, और 'this.poNumber' है, जो छंटनी वाली स्ट्रिंग प्राप्त करेगी।

1

आपकी फ़ाइल में गैर-असीसी व्हाइटस्पेस हो सकती है जिसे छंटनी नहीं की जा रही है। उदाहरण के लिए एक यूनिकोड चरित्र गैर-ब्रेकिंग स्पेस (यू + 00 ए0) है, जो व्हाइटस्पेस के रूप में प्रदर्शित होता है लेकिन ट्रिम द्वारा नहीं माना जाता है (यह ऐसा कुछ है जिसे आप वर्डपैड या अन्य संपादकों में संपादित दस्तावेज़ में देख सकते हैं जो "मदद करने का प्रयास करता है "आप।) यदि आप String.trim() की परिभाषा को देखते हैं तो यह उन वर्णों को हटा देता है जो < = '' (यानी मान कम या 20 के बराबर हैं)।

तो अपनी स्ट्रिंग के बाइट मान मुद्रित करें (या हेक्स संपादक में इसे देखें) और सुनिश्चित करें कि आपकी रिक्त स्थान वास्तव में स्थान हैं (यानी दशमलव मान 20)। यदि आपको अन्य व्यवहार की आवश्यकता है तो आपको अपना खुद का ट्रिम उपयोगिता फ़ंक्शन लिखना पड़ सकता है जो उचित यूनिकोड कैरेक्टर.इस व्हाइटस्पेस (चार) चेक का उपयोग करता है।

+0

इसे कैसे करें, मैं इस बारे में निश्चित नहीं हूं कि हम बाइट कोड मान कैसे प्रिंट कर सकते हैं। – Rachel

+0

छोटा नोट - "दशमलव मान 20" शायद या तो "दशमलव मान 32" या "हेक्स मान 20" पढ़ना चाहिए ... – weiresr

0

आप इस फ़ंक्शन का उपयोग कर सकते हैं, मैंने जावा ट्रिम() विधि पर कुछ हेरफेर किया है और यह कुछ प्रतिस्थापन() विधियों की तुलना में बेहतर, तेज़ और कुशल तरीका है।

public static String trimAdvanced(String value) { 

     Objects.requireNonNull(value); 

     int strLength = value.length(); 
     int len = value.length(); 
     int st = 0; 
     char[] val = value.toCharArray(); 

     if (strLength == 0) { 
      return ""; 
     } 

     while ((st < len) && (val[st] <= ' ') || (val[st] == '\u00A0')) { 
      st++; 
      if (st == strLength) { 
       break; 
      } 
     } 
     while ((st < len) && (val[len - 1] <= ' ') || (val[len - 1] == '\u00A0')) { 
      len--; 
      if (len == 0) { 
       break; 
      } 
     } 


     return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value; 
    } 
संबंधित मुद्दे