एक निश्चित स्थिति में एक स्ट्रिंग में एक चरित्र कैसे डालें?


155

मैं int6 अंकों के मूल्य के साथ मिल रहा हूं । मैं इसे Stringदशमलव बिंदु (।) के साथ 2 अंकों के अंत के रूप में प्रदर्शित करना चाहता हूं int। मैं उपयोग करना चाहता floatथा लेकिन Stringबेहतर प्रदर्शन आउटपुट के लिए उपयोग करने का सुझाव दिया गया (इसके बजाय ) 1234.5होगा 1234.50। इसलिए, मुझे एक फ़ंक्शन की आवश्यकता है जो एक intपैरामीटर के रूप में ले जाएगा और Stringअंत से दशमलव बिंदु 2 अंकों के साथ ठीक से स्वरूपित करेगा।

कहते हैं:

int j= 123456 
Integer.toString(j); 

//processing...

//output : 1234.56

1
String str = Integer.toString(j); //integer or string with white spaces<br/> str = new StringBuffer(str.trim()).insert(str.length()-2, ".").toString();
user881703

जवाबों:


195
int j = 123456;
String x = Integer.toString(j);
x = x.substring(0, 4) + "." + x.substring(4, x.length());

6
तार अपरिवर्तनीय हैं। जबकि यह काम करता है, StringBuilder जैसी किसी चीज़ का उपयोग करना नैतिक रूप से सही है, इसका उल्लेख नहीं करना आपके कोड को तेज़ बना देगा।
व्हर्सेस्माइकोकी

7
स्ट्रिंगबर्ल को भूल जाओ। इस तरह के स्वरूपण के साथ, String.format सबसे अच्छा विकल्प उपलब्ध है।
नोबल उत्थान

33
कोई लूप नहीं है, यह एक साधारण कॉन्सेप्टेशन केस है और कंपाइलर को इसे स्ट्रिंग बिल्डर का उपयोग करके ऑप्टिमाइज़ करना चाहिए, पठनीयता के लिए मैं + ऑपरेटर का उपयोग करना पसंद करता हूं, इस मामले में स्ट्रींगबर्ल का स्पष्ट रूप से उपयोग करने की कोई आवश्यकता नहीं है। "StringBuilder" समाधान का उपयोग करना क्योंकि यह तेजी से अनुकूलन नियमों का सम्मान नहीं करता है। पठनीयता के लिए कोड। प्रोफाइलिंग के बाद ऑप्टिमाइज़ करें और केवल जहाँ इसकी आवश्यकता हो। en.wikipedia.org/wiki/Program_optimization#Quotes
रेमी मोरिन

17
दूसरे सबस्ट्रिंग कॉल पर आपको x.length () की आवश्यकता नहीं है।
क्रेजीग्यू

1
जब यह संख्या भिन्न अंकों की होगी तो यह समाधान विफल हो जाएगा। 12345 के लिए यह 1234.5 का उत्पादन करेगा और 1234567 के लिए यह 1234.567 होगा। यदि आप हमेशा चाहते हैं कि अंतिम 2 अंक दशमलव बिंदु के बाद हों, तो सुनिश्चित करें कि संख्या में कम से कम 3 अंक हों और फिर करेंx = x.substring(0, x.length()-2) + "." + x.substring(x.length()-2);
Teodor Marinescu

210

के रूप में टिप्पणी में उल्लेख किया है, एक StringBuilder शायद एक का उपयोग करने से एक तेजी से कार्यान्वयन है StringBuffer । जैसा कि जावा डॉक्स में बताया गया है:

यह वर्ग StringBuffer के साथ संगत API प्रदान करता है, लेकिन सिंक्रनाइज़ेशन की कोई गारंटी नहीं है। इस वर्ग को स्ट्रिंग-बफ़र के लिए ड्रॉप-इन प्रतिस्थापन के रूप में उपयोग करने के लिए डिज़ाइन किया गया है जहां स्ट्रिंग बफर का उपयोग एक ही धागे द्वारा किया जा रहा था (जैसा कि आमतौर पर होता है)। जहां संभव हो, यह अनुशंसा की जाती है कि इस वर्ग का उपयोग स्ट्रिंगबफ़र के लिए प्राथमिकता में किया जाए क्योंकि यह अधिकांश कार्यान्वयनों के तहत तेज़ होगा।

उपयोग:

String str = Integer.toString(j);
str = new StringBuilder(str).insert(str.length()-2, ".").toString();

या अगर आपको सिंक्रोनाइज़ेशन की जरूरत है तो इसी तरह के उपयोग के साथ StringBuffer का उपयोग करें:

String str = Integer.toString(j);
str = new StringBuffer(str).insert(str.length()-2, ".").toString();

1
यह समाधान किसी भी स्ट्रिंग> = 4 वर्णों के लिए काम करता है: स्ट्रिंग "111" ने मुझे ".111" दिया, और इसमें परिणाम से कम कुछ भी नहीं है java.lang.StringIndexOutOfBoundsException(एक संदर्भ का उपयोग करने का प्रयास जो मौजूद नहीं है)।
sotrh

17
int yourInteger = 123450;
String s = String.format("%6.2f", yourInteger / 100.0);
System.out.println(s);

मैं का उपयोग कर सुझाव है java.math.BigDecimalका उपयोग कर के रूप में doubleपैदा कर सकता है त्रुटि गोलाई । यदि सटीकता doubleकी तुलना में गति अधिक मूल्यवान है तो बेहतर है।
sotrh

5

अधिकांश उपयोग-मामलों में, StringBuilder(जैसा कि पहले ही उत्तर दिया गया है) इसका उपयोग करना एक अच्छा तरीका है। हालाँकि, यदि प्रदर्शन मायने रखता है, तो यह एक अच्छा विकल्प हो सकता है।

/**
 * Insert the 'insert' String at the index 'position' into the 'target' String.
 * 
 * ````
 * insertAt("AC", 0, "") -> "AC"
 * insertAt("AC", 1, "xxx") -> "AxxxC"
 * insertAt("AB", 2, "C") -> "ABC
 * ````
 */
public static String insertAt(final String target, final int position, final String insert) {
    final int targetLen = target.length();
    if (position < 0 || position > targetLen) {
        throw new IllegalArgumentException("position=" + position);
    }
    if (insert.isEmpty()) {
        return target;
    }
    if (position == 0) {
        return insert.concat(target);
    } else if (position == targetLen) {
        return target.concat(insert);
    }
    final int insertLen = insert.length();
    final char[] buffer = new char[targetLen + insertLen];
    target.getChars(0, position, buffer, 0);
    insert.getChars(0, insertLen, buffer, position);
    target.getChars(position, targetLen, buffer, position + insertLen);
    return new String(buffer);
}

4

ApacheCommons3 StringUtils का उपयोग करना, आप भी कर सकते हैं

int j = 123456;
String s = Integer.toString(j);
int pos = s.length()-2;

s = StringUtils.overlay(s,".", pos, pos);

यदि आप पुस्तकालयों का उपयोग करने में कोई आपत्ति नहीं करते हैं, या पहले से स्ट्रिंगिंग यूटिल्स पर निर्भर करते हैं, तो यह मूल रूप से संघनन लेकिन छोटा है


2

आप उपयोग कर सकते हैं

System.out.printf("%4.2f%n", ((float)12345)/100));

टिप्पणियों के अनुसार, 12345 / 100.0 बेहतर होगा, क्योंकि फ्लोट के बजाय डबल का उपयोग होगा।


2
doubleएक बेहतर विकल्प हो सकता है। फ्लोट केवल 6 अंकों के लिए सटीक है।
पीटर लॉरी

1
हां, किसी अन्य उदाहरण के साथ किसी ने जवाब दिया कि 12345 / 100.0 का उपयोग करना था, जो कि होशियार है (हालांकि यह उसी परिणाम के साथ समाप्त होता है।)
जोसेफ ओटिंगर

नाइटपैकिंग: मुझे लगता है कि यह सही परिणाम नहीं देगा, क्योंकि पूर्णांक में 12345/100 = 123 और उसके बाद केवल 123.00 पर डाला जाता है। ((फ्लोट) 12345/100) काम करेगा।
ररौनी

हेह, अच्छी बात है - मैं इस बात को पहले से ध्यान में नहीं रख रहा था, क्योंकि ज्यादातर पहली बार जब वह भागा तो उसने उसे छिन्न-भिन्न परिणाम दे दिया। पोस्ट को ठीक करेगा (जो पहले 12345/100 कहता था, फिर परिणाम को पहले मूल्य को चौड़ा करने के बजाय डाला।)
जोसेफ ओटिंगर

0

यदि आप ऐसी प्रणाली का उपयोग कर रहे हैं जहां फ्लोट महंगी है (उदाहरण के लिए कोई FPU) या अनुमति नहीं है (जैसे लेखांकन में) तो आप कुछ इस तरह का उपयोग कर सकते हैं:

    for (int i = 1; i < 100000; i *= 2) {
        String s = "00" + i;
        System.out.println(s.substring(Math.min(2, s.length() - 2), s.length() - 2) + "." + s.substring(s.length() - 2));
    }

अन्यथा DecimalFormat बेहतर समाधान है। (ऊपर स्ट्रिंग स्ट्रिंग संस्करण छोटी संख्या के साथ काम नहीं करेगा (<100)


2
लेखांकन के मामले में, आप BigDecimal के साथ बेहतर व्यवहार करेंगे।
जोसेफ ओटिंगर

@ जोसेफ: आप सही कह रहे हैं। मैं लेखांकन में नहीं हूं और मैं ज्यादातर प्रदर्शन कारणों (एम्बेडेड जावा में) के लिए एक निश्चित बिंदु प्रतिनिधित्व के रूप में ints का उपयोग करता हूं, इसलिए BigDecimal मेरी पसंद नहीं है ;-)
rurouni

0

मुझे लगता है कि एक निश्चित स्थिति में एक स्ट्रिंग डालने के लिए एक सरल और अधिक सुरुचिपूर्ण समाधान यह एक-लाइनर होगा:

target.replaceAll("^(.{" + position + "})", "$1" + insert);

उदाहरण के लिए, :एक समय में एक लापता डालने के लिए स्ट्रिंग:

"-0300".replaceAll("^(.{3})", "$1:");

यह क्या करता है, positionस्ट्रिंग की शुरुआत के पात्रों से मेल खाता है, जो समूह हैं, और समूह को स्वयं ( $1) के बाद बदल देता हैinsert स्ट्रिंग के । भले ही हमेशा एक घटना हो, भले ही रीप्लेक्स होना चाहिए, भले ही सभी जगह बदलें।

बेशक इसमें स्टर्लिंगब्यूस्टल समाधान के समान प्रदर्शन नहीं है, लेकिन मेरा मानना ​​है कि एक-लाइनर (एक विशाल विधि की तुलना में) को पढ़ने के लिए एक सरल और आसान के रूप में सफलता और लालित्य इसे सबसे गैर प्रदर्शन में पसंदीदा समाधान बनाने के लिए पर्याप्त है -सामान्य उपयोग के मामले।

ध्यान दें कि मैं प्रलेखन कारणों से शीर्षक में सामान्य समस्या को हल कर रहा हूं, निश्चित रूप से यदि आप दशमलव संख्या के साथ काम कर रहे हैं तो आपको प्रस्तावित डोमेन-विशिष्ट समाधान का उपयोग करना चाहिए।


0

String.format ("% 0d।% 02d", d / 100, d% 100);


जिस किसी ने भी इसे अस्वीकार किया है: ओपी ने जो वर्णन किया है, उसे फिर से पढ़ें। यह समस्या का सटीक उत्तर प्रदान करता है: कोई फ़्लोटिंग पॉइंट गणित नहीं। दशमलव बिंदु को सही जगह पर रखता है। बुद्धि के लिए, stackoverflow.com/a/5884413/972128 एक समान उत्तर प्रदान करता है , लेकिन फ़्लोटिंग पॉइंट (वांछित नहीं) का उपयोग करता है, और इस समय 17 अपवोट हैं।
काकुरियन

0

कोटलिन दोस्तों के लिए) स्वीकृत उत्तर से (@ माइकटेम्सन के)

fun String.insert(index: Int, string: String): String {
    return this.substring(0, index) + string + this.substring(index, this.length)
}

टेस्ट ✅

"ThisTest".insert(4, "Is").should.equal("ThisIsTest")

-2
  public static void main(String[] args) {
    char ch='m';
    String str="Hello",k=String.valueOf(ch),b,c;

    System.out.println(str);

    int index=3;
    b=str.substring(0,index-1 );
    c=str.substring(index-1,str.length());
    str=b+k+c;
}

-2
// Create given String and make with size 30
String str = "Hello How Are You";

// Creating StringBuffer Object for right padding
StringBuffer stringBufferRightPad = new StringBuffer(str);
while (stringBufferRightPad.length() < 30) {
    stringBufferRightPad.insert(stringBufferRightPad.length(), "*");
}

System.out.println("after Left padding : " + stringBufferRightPad);
System.out.println("after Left padding : " + stringBufferRightPad.toString());

// Creating StringBuffer Object for right padding
StringBuffer stringBufferLeftPad = new StringBuffer(str);
while (stringBufferLeftPad.length() < 30) {
    stringBufferLeftPad.insert(0, "*");
}
System.out.println("after Left padding : " + stringBufferLeftPad);
System.out.println("after Left padding : " + stringBufferLeftPad.toString());

2
ढेर अतिप्रवाह में आपका स्वागत है! आम तौर पर, उत्तर बहुत अधिक सहायक होते हैं यदि वे इस बात का स्पष्टीकरण शामिल करते हैं कि कोड क्या करने का इरादा है, और क्यों यह दूसरों को पेश किए बिना समस्या को हल करता है। उत्तर के संदर्भ मूल्य में सुधार करने और इसे अधिक समझने योग्य बनाने के लिए धन्यवाद!
टिम डाईकमैन

कृपया StringBuffer का उपयोग न करें क्योंकि इसे 2004 में StringBuilder द्वारा बदल दिया गया था।
पीटर लॉरी

-2

इसे इस्तेमाल करे :

public String ConvertMessage(String content_sendout){

        //use unicode (004E00650077) need to change to hex (&#x004E&#x;0065&#x;0077;) first ;
        String resultcontent_sendout = "";
        int i = 4;
        int lengthwelcomemsg = content_sendout.length()/i;
        for(int nadd=0;nadd<lengthwelcomemsg;nadd++){
            if(nadd == 0){
                resultcontent_sendout = "&#x"+content_sendout.substring(nadd*i, (nadd*i)+i) + ";&#x";
            }else if(nadd == lengthwelcomemsg-1){
                resultcontent_sendout += content_sendout.substring(nadd*i, (nadd*i)+i) + ";";
            }else{
                resultcontent_sendout += content_sendout.substring(nadd*i, (nadd*i)+i) + ";&#x";
            }
        }
        return resultcontent_sendout;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.