একটি নির্দিষ্ট অবস্থানে স্ট্রিংয়ে একটি অক্ষর কীভাবে সন্নিবেশ করা যায়?


155

আমি intএকটি 6 ডিজিটের মান সহ পেয়ে যাচ্ছি । আমি এটিকে 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();
ব্যবহারকারী 881703

উত্তর:


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

6
স্ট্রিংগুলি অপরিবর্তনীয়। এটি কাজ করার সময়, স্ট্রিংবিল্ডারের মতো কিছু ব্যবহার করা নৈতিকভাবে সঠিক, উল্লেখ না করা আপনার কোডটি আরও দ্রুত তৈরি করবে।
Wheresmycookie

7
স্ট্রিংবিল্ডারকে ভুলে যান। এর মতো ফর্ম্যাটিংয়ের সাথে স্ট্রিং.ফোর্ম্যাট হ'ল সর্বোত্তম বিকল্প।
NobleUplift

33
কোনও লুপ নেই, এটি একটি সাধারণ কনটেন্টেশন কেস এবং সংকলকটিকে স্ট্রিং বিল্ডার ব্যবহার করে এটি অনুকূলকরণ করা উচিত, পাঠযোগ্যতার জন্য আমি + অপারেটরটি ব্যবহার করতে পছন্দ করি, স্ট্রিংবিল্ডারকে স্পষ্টভাবে ব্যবহার করার জন্য এই ক্ষেত্রে কোনও প্রয়োজন নেই। "স্ট্রিংবিল্ডার" সমাধানটি ব্যবহার করা কারণ এটি দ্রুত অপ্টিমাইজেশনের নিয়মকে সম্মান করে না। পাঠযোগ্যতার জন্য কোড। প্রোফাইলিংয়ের পরে এবং কেবল যেখানে এটি প্রয়োজন সেখানে অনুকূলিত করুন। en.wikedia.org/wiki/Praram_optimization#Quotes
রেমি মরিন

17
দ্বিতীয় সাবস্ট্রিং কলটিতে আপনার x.leth () দরকার নেই।
ক্রেজিগুই

1
এই সংখ্যাটি ব্যর্থ হবে যখন সংখ্যাটি ভিন্ন সংখ্যা। 12345 এর জন্য এটি 1234.5 আউটপুট দেবে এবং 1234567 এর জন্য এটি 1234.567 হবে। আপনি যদি সর্বদা সর্বনিম্ন 2 টি সংখ্যা দশমিক পয়েন্টের পরে দেখতে চান তবে নিশ্চিত হন যে সংখ্যাটি কমপক্ষে 3 ডিজিটের পরে রয়েছেx = x.substring(0, x.length()-2) + "." + x.substring(x.length()-2);
তেওডোর মেরিনেস্কু

210

মন্তব্যে উল্লিখিত হিসাবে, একটি স্ট্রিংবুডার সম্ভবত স্ট্রিংবফার ব্যবহারের চেয়ে দ্রুত বাস্তবায়ন । জাভা ডক্সে উল্লিখিত হিসাবে:

এই শ্রেণিটি স্ট্রিংবুফারের সাথে সামঞ্জস্যপূর্ণ একটি এপিআই সরবরাহ করে তবে সিঙ্ক্রোনাইজেশনের কোনও গ্যারান্টি ছাড়াই। এই শ্রেণিটি স্ট্রিংবাফারের জন্য ড্রপ-ইন প্রতিস্থাপন হিসাবে যে জায়গাগুলিতে স্ট্রিং বাফারটি একক থ্রেড দ্বারা ব্যবহৃত হচ্ছিল (যেমনটি সাধারণভাবে হয় তেমন) use যেখানে সম্ভব, এটি সুপারিশ করা হয় যে এই শ্রেণিটি স্ট্রিংবাফারকে অগ্রাধিকার হিসাবে ব্যবহার করা উচিত কারণ এটি বেশিরভাগ বাস্তবায়নের অধীনে দ্রুততর হবে।

ব্যবহার:

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

অথবা আপনার যদি সিঙ্ক্রোনাইজেশন প্রয়োজন হয় অনুরূপ ব্যবহারের সাথে স্ট্রিংবাফারটি ব্যবহার করুন:

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

1
এই সমাধানটি যে কোনও স্ট্রিং> = 4 টি অক্ষরের জন্য কাজ করে: "111" স্ট্রিংটি আমাকে ".111" দিয়েছে, এবং এর চেয়ে কম কিছুতেই এর ফলাফল java.lang.StringIndexOutOfBoundsException(উপস্থিত নেই এমন একটি রেফারেন্স অ্যাক্সেস করার চেষ্টা করা) ফলাফল in
sotrh

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

আমি ব্যবহার সুপারিশ করবে java.math.BigDecimalব্যবহার doubleহতে পারে ত্রুটি rounding । গতি যদি নির্ভুলতার চেয়ে মূল্যবান 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

অ্যাপাচিকমন্স 3 স্ট্রিং ইউটিলগুলি ব্যবহার করে আপনি এটিও করতে পারেন

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 ডিজিটের সঠিক accurate
পিটার লরে 14

1
হ্যাঁ, অন্য যে কেউ প্রতিক্রিয়া জানিয়েছিল তা হল 12345 / 100.0 ব্যবহার করা, যা স্মার্ট (যদিও এটি একই ফলাফলের সাথে শেষ হয়))
জোসেফ অ্যাটঞ্জার

নিতপিকিং: আমার মনে হয় এটি সঠিক ফলাফল দেয় না কারণ 12345/100 = 123 পূর্ণসংখ্যায় এবং কেবল পরে 123.00 এ ফেলে দেওয়া হয়। ((ভাসা) 12345/100) কাজ করবে।
rurouni

হি, ভাল কথা - আমি নজরে বিবেচনা করছিলাম না, বেশিরভাগ কারণ তিনি প্রথমবারের মতো এটি চালিয়েছিলেন এবং তাকে ছাঁটাইয়া ফলাফল দিতেন। পোস্টটি ঠিক করে দেবে (যা আগে 12345/100 বলত, তারপরে প্রথমে মানকে প্রশস্ত করার পরিবর্তে ফলাফলটি দেয়))
জোসেফ অটিঞ্জার

0

আপনি যদি এমন কোনও সিস্টেম ব্যবহার করছেন যেখানে ভাসা ব্যয়বহুল (যেমন কোনও এফপিইউ নেই) বা অনুমোদিত নয় (যেমন অ্যাকাউন্টিংয়ে) আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

    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));
    }

অন্যথায় ডেসিমালফর্ম্যাট আরও ভাল সমাধান। (উপরের স্ট্রিংবিল্ডার ভেরিয়েন্টটি অল্প সংখ্যার সাথে কাজ করবে না (<100)


2
অ্যাকাউন্টিংয়ের ক্ষেত্রে, আপনি বিগডিসিমালের সাথে আরও ভাল থাকবেন।
জোসেফ অটিঞ্জার 14

@ জোসেফ: আপনি ঠিক বলেছেন। আমি অ্যাকাউন্টে নেই এবং আমি বেশিরভাগই পারফরম্যান্সের কারণে (এম্বেডড জাভাতে) একটি নির্দিষ্ট পয়েন্ট প্রতিনিধিত্ব হিসাবে ইনস ব্যবহার করি, তাই বিগডিসিমাল আমার পছন্দ নয় ;-)
রুউনি

0

আমি মনে করি একটি নির্দিষ্ট অবস্থানে স্ট্রিং toোকানোর একটি সহজ এবং আরও মার্জিত সমাধান হ'ল এই ওয়ান-লাইনার:

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

উদাহরণস্বরূপ, একটি স্ট্রিংয়ের :মধ্যে একটি হারিয়ে যাওয়া সন্নিবেশ করা:

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

এটি যা করে তা হল positionস্ট্রিংয়ের শুরু থেকে অক্ষরগুলির সাথে মেলে , গোষ্ঠীগুলির সাথে নিজের গ্রুপটি প্রতিস্থাপন করে ( $1) insertস্ট্রিংয়ের পরে। প্রতিস্থাপনের সমস্ত কিছু মনে রাখুন, যদিও সবসময়ই একটি ঘটনা থাকে, কারণ প্রথম প্যারামিটারটি অবশ্যই একটি রেজেক্স হতে হবে।

অবশ্যই এটি স্ট্রিংবিল্ডার সলিউশনের মতো একই পারফরম্যান্সটি রাখে না, তবে আমি বিশ্বাস করি যে একটি লাইনার পড়ার জন্য একটি সহজ এবং সহজ হিসাবে সাবলীলতা এবং কমনীয়তা (একটি বিশাল পদ্ধতির তুলনায়) বেশিরভাগ অ-পারফরম্যান্সে এটি পছন্দসই সমাধান তৈরি করার জন্য যথেষ্ট I ক্রিটিকাল ব্যবহারের ক্ষেত্রে।

নোট আমি ডকুমেন্টেশনের কারণে শিরোনামে জেনেরিক সমস্যাটি সমাধান করছি, অবশ্যই যদি আপনি দশমিক সংখ্যার সাথে সম্পর্কিত হন তবে আপনাকে ইতিমধ্যে প্রস্তাবিত ডোমেন-নির্দিষ্ট সমাধানগুলি ব্যবহার করা উচিত।


0

স্ট্রিং.ফর্ম্যাট ("% 0 ডি।% 02 ডি", ডি / 100, ডি% 100);


যারাই এটি হ্রাস করেছে: ওপি বিস্তারিতভাবে কী বর্ণনা করেছে তা পুনরায় পড়ুন। এটি সমস্যার সঠিক উত্তর সরবরাহ করে: কোন ভাসমান পয়েন্ট গণিত নেই। দশমিক পয়েন্টটি সঠিক জায়গায় রাখে। বুদ্ধি করতে, stackoverflow.com/a/5884413/972128 একটি অনুরূপ উত্তর প্রদান করে কিন্তু ফ্লোটিং পয়েন্ট (পছন্দসই নয়) ব্যবহার করে এবং এই সময়ে 17 upvotes হয়েছে।
কুকুরিয়ান

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
স্ট্যাক ওভারফ্লোতে স্বাগতম! সাধারণত, উত্তরগুলি আরও কার্যকর হয় যদি সেগুলিতে কোডটি কী করা উচিত এবং কেন এটি অন্যকে পরিচয় করিয়ে না দিয়ে সমস্যার সমাধান করে তার ব্যাখ্যা অন্তর্ভুক্ত করে। উত্তরের রেফারেন্স মানটি উন্নত করার জন্য এবং এটি আরও বোধগম্য করার জন্য ধন্যবাদ!
টিম ডিকম্যান

দয়া করে স্ট্রিংবাফার ব্যবহার করবেন না কারণ এটি 2004 এ স্ট্রিংবিল্ডার দ্বারা প্রতিস্থাপিত হয়েছিল
পিটার ল্যারি

-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;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.