স্কালায় java.String.format কীভাবে ব্যবহার করবেন?


322

আমি .formatএকটি স্ট্রিংয়ের একটি পদ্ধতি ব্যবহার করার চেষ্টা করছি । তবে আমি যদি% 1,% 2, ইত্যাদি স্ট্রিংয়ে রাখি, java.util.UnعلومFormatConversionException একটি বিভ্রান্তিকর জাভা উত্স কোড টুকরা নির্দেশ করে নিক্ষেপ করা হয়:

private void checkText(String s) {

    int idx;

    // If there are any '%' in the given string, we got a bad format
    // specifier.
    if ((idx = s.indexOf('%')) != -1) {
        char c = (idx > s.length() - 2 ? '%' : s.charAt(idx + 1));
        throw new UnknownFormatConversionException(String.valueOf(c));
    }
}

এ থেকে আমি বুঝতে পারি যে %চর নিষিদ্ধ। যদি তা হয় তবে আমি যুক্তির স্থানধারীদের জন্য কী ব্যবহার করব?

আমি স্কেলা ২.৮ ব্যবহার করি ।

উত্তর:


302

পূর্ববর্তী সমস্ত প্রতিক্রিয়াগুলি সঠিক হলেও এগুলি সব জাভাতে রয়েছে। এখানে একটি স্কেলার উদাহরণ রয়েছে:

val placeholder = "Hello %s, isn't %s cool?"
val formatted = placeholder.format("Ivan", "Scala")

পাইথনের অপারেটরটির মতো তৈরিformat% সম্পর্কে আমার একটি ব্লগ পোস্টও রয়েছে যা কার্যকর হতে পারে।



1
আপনি প্রয়োগের দ্বারা প্রক্রিয়া সহজ করতে format: STRING আক্ষরিক সরাসরি"Hello %s, isn't %s cool?".format("Ivan", "Scala")
sotrh

298

অবস্থান নির্ধারণের জন্য আপনার সংখ্যা ব্যবহার করার দরকার নেই। ডিফল্টরূপে, আর্গুমেন্টের অবস্থানটি কেবল স্ট্রিংয়ে প্রদর্শিত হয় সেই ক্রম।

এটি ব্যবহারের যথাযথ পদ্ধতির উদাহরণ এখানে:

String result = String.format("The format method is %s!", "great");
// result now equals  "The format method is great!".

%পদ্ধতিটি কীভাবে স্ট্রিংটি প্রদর্শন করা উচিত তা জানতে আপনি সর্বদা কিছু অন্যান্য অক্ষর অনুসরণ করবেন। %sসম্ভবত এটি সবচেয়ে সাধারণ, এবং এর কেবলমাত্র যুক্তিটি একটি স্ট্রিং হিসাবে বিবেচনা করা উচিত।

আমি প্রতিটি বিকল্পের তালিকা করব না, তবে কেবল একটি ধারণা দেওয়ার জন্য আমি কয়েকটি উদাহরণ দেব:

// we can specify the # of decimals we want to show for a floating point:
String result = String.format("10 / 3 = %.2f", 10.0 / 3.0);
// result now equals  "10 / 3 = 3.33"

// we can add commas to long numbers:
result = String.format("Today we processed %,d transactions.", 1000000);
// result now equals  "Today we processed 1,000,000 transactions."

String.formatকেবলমাত্র একটি ব্যবহার করে java.util.Formatter, সুতরাং বিকল্পগুলির পুরো বিবরণের জন্য আপনি ফর্ম্যাটর জাভাদোকগুলি দেখতে পারেন ।

এবং, বালুসসি যেমন উল্লেখ করেছেন, আপনি ডকুমেন্টেশনে দেখবেন যে আপনার প্রয়োজন হলে ডিফল্ট আর্গুমেন্ট ক্রমটি পরিবর্তন করা সম্ভব। তবে আপনি যদি একবারে একই যুক্তিটি ব্যবহার করে থাকেন তবে কেবল একবার আপনার প্রয়োজন / এটি করতে চান।


127

উত্স কোডটি দেখার পরিবর্তে আপনার জাভাদোক স্ট্রিং.ফোর্ম্যাট () এবং ফর্ম্যাটর সিনট্যাক্সটি পড়তে হবে ।

আপনি% এর পরে মানটির বিন্যাস নির্দিষ্ট করে দিন। উদাহরণস্বরূপ এটি দশমিক পূর্ণসংখ্যা dএবং স্ট্রিংয়ের জন্য এটি s:

String aString = "world";
int aInt = 20;
String.format("Hello, %s on line %d",  aString, aInt );

আউটপুট:

Hello, world on line 20

কি আপনি (একটি আর্গুমেন্ট সূচক ব্যবহার করুন) চেষ্টা কাজের জন্য, আপনি ব্যবহার করুন: *n*$,

String.format("Line:%2$d. Value:%1$s. Result: Hello %1$s at line %2$d", aString, aInt );

আউটপুট:

Line:20. Value:world. Result: Hello world at line 20

70

আপনি এটি ব্যবহার করতে পারেন;

String.format("%1$s %2$s %2$s %3$s", "a", "b", "c");

আউটপুট:

abbc


1
আমি এই ধরণের ব্যবহার কখনও দেখিনি, পুনরাবৃত্ত স্ট্রিংয়ের সময় এটি খুব দরকারী!
ডোমি.জ্যাং

8
আপনি সি সি বিকাশকারী হিসাবে যা ব্যবহার করেন এটি +1 এর মতো। এখন পর্যন্ত, আমরা ব্যবহার {0}এবং {1}পরিবর্তে %1$এবং %2$
ashes999

@ ashes999 আমি সি # ল্যান্ড থেকেও আছি। আমি সংখ্যায়িত বন্ধনীগুলিতে এতটাই অভ্যস্ত যে আমি ভুলে যেতে পারি যে জিনিসগুলি করার মানক উপায় ছিল না। শতকরা লক্ষণগুলি দেখলে এগুলি আবার ফিরে আসে!
জনিআআআআআআ

13

এছাড়াও নোট করুন যে স্কালা স্ট্রিংকে অনেকগুলি পদ্ধতির সাথে প্রসারিত করে (প্রিডেফের দ্বারা আনা একটি মোড়ানো স্ট্রিংকে অন্তর্নিহিত রূপান্তরের মাধ্যমে) যাতে আপনি নিম্নলিখিতগুলিও করতে পারেন:

val formattedString = "Hello %s, isn't %s cool?".format("Ivan", "Scala")


10

স্কালায় 2.10

val name = "Ivan"
val weather = "sunny"

s"Hello $name, it's $weather today!"

1
আমি এটি গ্রহণ করি যে এটি কেবল স্ট্রিং কনটেনটেশনের একটি বিশেষ বাক্য গঠন (যার অর্থ $ নাম এবং $ আবহাওয়া এর আগে সংজ্ঞাযুক্ত ভেরিয়েবলগুলির কঠোর উল্লেখ)। স্ট্রিং.ফরমেট প্যারামিটার হিসাবে টেমপ্লেটটি নেয় এবং সুতরাং এটি কোনও বৈশিষ্ট্য ফাইল এবং এ জাতীয় থেকে টেমপ্লেট পুনরুদ্ধার করে তোলে। - উপরের সিনট্যাক্স দিয়ে কি তা সম্ভব?
চিককোডোরো

একে স্ট্রিং ইন্টারপোলেশন বলা হয়, স্কালার মধ্যে দুটি প্রকার রয়েছে: এস "" এবং এফ "", 'গুলি' সরল স্ট্রিং এবং 'চ' এর সমান printf, আপনি নিজের প্রান্তিকরণটিকেও সংজ্ঞায়িত করতে পারেন (আমি না চেষ্টা)। এর $nameপরিবর্তে ভেরিয়েবলের মানটি প্রতিস্থাপনের প্রয়োজন হয় name, আপনি ইন্টারপোলেশনটিতেও অপারেশন করতে পারেন, উদাহরণস্বরূপs"Hello ${name.toUpperCase}, it's $weather today!"
লন্ডো

3

এটি কি String.formatকরতে পারে তার একটি তালিকা । একই জন্য যায়printf

int i = 123;
o.printf( "|%d|%d|%n" ,       i, -i );      // |123|-123|
o.printf( "|%5d|%5d|%n" ,     i, -i );      // |  123| –123|
o.printf( "|%-5d|%-5d|%n" ,   i, -i );      // |123  |-123 |
o.printf( "|%+-5d|%+-5d|%n" , i, -i );      // |+123 |-123 |
o.printf( "|%05d|%05d|%n%n",  i, -i );      // |00123|-0123|

o.printf( "|%X|%x|%n", 0xabc, 0xabc );      // |ABC|abc|
o.printf( "|%04x|%#x|%n%n", 0xabc, 0xabc ); // |0abc|0xabc|

double d = 12345.678;
o.printf( "|%f|%f|%n" ,         d, -d );    // |12345,678000|     |-12345,678000|
o.printf( "|%+f|%+f|%n" ,       d, -d );    // |+12345,678000| |-12345,678000|
o.printf( "|% f|% f|%n" ,       d, -d );    // | 12345,678000| |-12345,678000|
o.printf( "|%.2f|%.2f|%n" ,     d, -d );    // |12345,68| |-12345,68|
o.printf( "|%,.2f|%,.2f|%n" ,   d, -d );    // |12.345,68| |-12.345,68|
o.printf( "|%.2f|%(.2f|%n",     d, -d );    // |12345,68| |(12345,68)|
o.printf( "|%10.2f|%10.2f|%n" , d, -d );    // |  12345,68| | –12345,68|
o.printf( "|%010.2f|%010.2f|%n",d, -d );    // |0012345,68| |-012345,68|

String s = "Monsterbacke";
o.printf( "%n|%s|%n", s );                  // |Monsterbacke|
o.printf( "|%S|%n", s );                    // |MONSTERBACKE|
o.printf( "|%20s|%n", s );                  // |        Monsterbacke|
o.printf( "|%-20s|%n", s );                 // |Monsterbacke        |
o.printf( "|%7s|%n", s );                   // |Monsterbacke|
o.printf( "|%.7s|%n", s );                  // |Monster|
o.printf( "|%20.7s|%n", s );                // |             Monster|

Date t = new Date();
o.printf( "%tT%n", t );                     // 11:01:39
o.printf( "%tD%n", t );                     // 04/18/08
o.printf( "%1$te. %1$tb%n", t );            // 18. Apr


1

যদিও @ লন্ডো স্কালার "গুলি" স্ট্রিং ইন্টারপোলটারের উল্লেখ করেছে, তবে আমি মনে করি স্কালার "চ" স্ট্রিং ইন্টারপোলটার মূল প্রশ্নের সাথে আরও প্রাসঙ্গিক। অন্যান্য প্রতিক্রিয়াগুলির জন্য কয়েকটি সময় ব্যবহৃত উদাহরণটিও (স্কেলা ২.১০ থেকে) এভাবে লেখা যেতে পারে:

scala> val name = "Ivan"
name: String = Ivan
scala> val thing = "Scala"
thing: String = Scala
scala> val formatted = f"Hello $name%s, isn't $thing%s cool?"
formatted: String = Hello Ivan, isn't Scala cool?

মূল প্রশ্নের সংযোগটি সচেতন হতে হবে যে:

  • formattedএকটি স্ট্রিং দিয়ে সংজ্ঞায়িত করা হয় যা "f" অক্ষরের সাথে উপস্থাপিত হয়। এটি "f" (ফর্ম্যাট) স্ট্রিং ইন্টারপোলটর।
  • "F" স্ট্রিং ইন্টারপোলটার ব্যবহার করে java.util.Formatter
  • java.lang.String.format একই ব্যবহার করে java.util.Formatter

স্ট্রিং ইন্টারপোলেশন সম্পর্কে দুর্দান্ত জিনিসটি আপনাকে দেখতে দেয় যে String.formatপদ্ধতিতে আর্গুমেন্টের সাথে এটির মিল না দিয়ে কোন পরিবর্তনশীল সরাসরি স্ট্রিংয়ের পরিবর্তে প্রতিস্থাপিত হচ্ছে ।


0

স্ক্যালায়, স্ট্রিং ইন্টারপোলেশনটির জন্য আমাদের রয়েছে $ যা দিনটি বাঁচায় এবং আমাদের জীবনকে অনেক সহজ করে তোলে:

উদাহরণ স্বরূপ: আপনি এমন একটি ফাংশন সংজ্ঞায়িত করতে চান যা ইনপুট নাম এবং বয়স নেয় এবং হ্যালো উইথ নামটি বলে এবং এর বয়স বলে। এটি এইভাবে লেখা যেতে পারে:

def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is $age"

অতএব, আপনি যখন এই ফাংশনটি কল করবেন: এটির মতো:

funcStringInterpolationDemo("Shivansh",22)

এর আউটপুট হবে:

Hey ! my name is Shivansh and my age is 22

আপনি কোডটি একই লাইনে পরিবর্তন করতে লিখতে পারেন, আপনি যদি বয়সের সাথে 10 বছর যোগ করতে চান!

তাহলে ফাংশনটি হতে পারে:

def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is ${age+10}"

এবং এখন আউটপুট হবে:

Hey ! my name is Shivansh and my age is 32
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.