আমি কীভাবে একটি স্ট্রিংটিকে জাভাতে কোনও রূপান্তর করতে পারি?


3026

আমি কিভাবে রূপান্তর করতে পারেন Stringএকটি থেকে intজাভা?

আমার স্ট্রিংয়ে কেবল সংখ্যা রয়েছে এবং আমি এটি প্রতিনিধিত্ব করে এমন নম্বরটি ফিরিয়ে দিতে চাই।

উদাহরণস্বরূপ, স্ট্রিং দেওয়া "1234"ফলাফলের সংখ্যা হওয়া উচিত 1234


1
যাইহোক, সচেতন হন যে যদি স্ট্রিংটি নাল হয় তবে কল: int i = Integer.parseInt (নাল); নলপয়েন্টারএক্সসেপশন নয়, নম্বরের ফর্ম্যাট এক্সেপশন নিক্ষেপ করে।
পাভেল মোলচানভ

2
আমি কিছুটা অবাক হয়েছি যে যখন স্পেসিফিকেশনের একটি গুরুত্বপূর্ণ অংশটি অনুপস্থিত থাকে তখন এই প্রশ্নটি এত বেশি রেটিং করা উচিত: স্ট্রিংটিতে কেবল অঙ্কগুলি না থাকলে কী হবে? উদাহরণস্বরূপ, অনেক উত্তর খুশিতে "-1" এবং "-1" কে পার্স করবে, তবে এটি গ্রহণযোগ্য কিনা তা আমরা জানি না।
মাইকেল কে

উত্তর:


4084
String myString = "1234";
int foo = Integer.parseInt(myString);

আপনি যদি জাভা ডকুমেন্টেশনের দিকে লক্ষ্য করেন তবে আপনি "ধরা" লক্ষ্য করবেন যে এই ফাংশনটি একটি নিক্ষেপ NumberFormatExceptionকরতে পারে, অবশ্যই আপনাকে কোনটি পরিচালনা করতে হবে:

int foo;
try {
   foo = Integer.parseInt(myString);
}
catch (NumberFormatException e)
{
   foo = 0;
}

(এই চিকিত্সাটি একটি ত্রুটিযুক্ত সংখ্যাকে ডিফল্ট করে 0তবে আপনি যদি চান তবে আপনি অন্য কিছু করতে পারেন))

বিকল্পভাবে, আপনি Intsপেয়ারা গ্রন্থাগার থেকে একটি পদ্ধতি ব্যবহার করতে পারেন , যা জাভা 8 এর সাথে সম্মিলিতভাবে Optionalএকটি স্ট্রিংকে একটি ইনটে রূপান্তর করার জন্য একটি শক্তিশালী এবং সংক্ষিপ্ত পথ তৈরি করে:

import com.google.common.primitives.Ints;

int foo = Optional.ofNullable(myString)
 .map(Ints::tryParse)
 .orElse(0)

23
একটি নম্বর ফরমেট এক্সেপশন ধরার পাশাপাশি, ব্যবহারকারীরা যে স্ট্রিংগুলি পার করছেন তার দৈর্ঘ্য সম্পর্কেও যত্নবান হওয়া উচিত; যদি তারা কোনও পূর্ণসংখ্যার উপচে পড়ার মতো দীর্ঘ হয় তবে তার পরিবর্তে তারা লং :: পার্সলং ব্যবহার করার বিষয়টি বিবেচনা করতে পারে।
অ্যালিসন

6
@ অ্যালিসন বিশেষত যদি পোস্টগ্রিজ এসকিউএল অটো বর্ধিত প্রাথমিক কী ক্ষেত্রের মধ্যে বিগিন্ট ক্ষেত্রটি ব্যবহার করে। লম্বা ব্যবহার করা অনেক বেশি নিরাপদ
লেটহোল্ডারস

7
যদি স্ট্রিং একটি প্রথম সংখ্যা আপনি পরীক্ষা পারে stackoverflow.com/questions/1102891/...
JPRLCol

দশটি বেসে কোনও পার্সেবল পূর্ণসংখ্যা না হলে এই পদ্ধতিটিও ব্যতিক্রম ছুঁড়ে দেয়। অন্যান্য বেসগুলিতে কাজ করতে ওভারলোডেড পদ্ধতিটি ব্যবহার করুন। যেমন Integer.parseInt ("1001", 8); বেস 8 জন্য। উত্স
লোকেশ

2
এছাড়াও, জাভা 8 এর ঐচ্ছিক সঙ্গে একযোগে পেয়ারা ব্যবহার করার সময় শক্তিশালী হতে পারে, এটা সম্ভবত একটি Overkill এবং ব্যবহারের সময় সংক্ষিপ্ত আকারে NumberUtils.toInt (স্ট্রিং Str, int- defaultValue) অ্যাপাচি থেকে Commons-ল্যাঙ গ্রন্থাগার:int foo = NumberUtils.toInt(myString, 0);
কুন্ড

681

উদাহরণস্বরূপ, এখানে দুটি উপায়:

Integer x = Integer.valueOf(str);
// or
int y = Integer.parseInt(str);

এই পদ্ধতির মধ্যে সামান্য পার্থক্য রয়েছে:

  • valueOf এর নতুন বা ক্যাশেড উদাহরণ প্রদান করে java.lang.Integer
  • parseIntআদিম ফেরত int

সমস্ত ক্ষেত্রে একই: Short.valueOf/ parseShort, Long.valueOf/ parseLong, ইত্যাদি for


80
দুটি পদ্ধতির মধ্যে পার্থক্যের জন্য, এই প্রশ্নটি দেখুন
হার্টজস্প্রং

19
valueOfপদ্ধতিটি কেবলreturn valueOf(parseInt(string));
পল ভেরেস্ট

@ পালভেরেস্ট আমি কি তা পাই না ... valueOfনিজেকে পুনরাবৃত্তি বলে?
idclev 463035818

1
@ ব্যবহারকারী 463035818 মানঅফ এর ইনট এবং স্ট্রিংয়ের জন্য দুটি ওভারলোড রয়েছে। valueOf(String)প্রথমে একটি int- এ ব্যবহার করার স্ট্রিং পার্স দ্বারা বাস্তবায়িত হয় parseInt(String)এবং তারপর ব্যবহার করে একটি পূর্ণসংখ্যা যে int- এ মোড়কে valueOf(int)। এখানে কোনও পুনরাবৃত্তি নেই কারণ valueOf(String)এবং valueOf(int)তাদের দুটি একই নাম থাকা সত্ত্বেও দুটি সম্পূর্ণ ভিন্ন ফাংশন।
ফিলিপ রোমান

244

ওয়েল, একটি খুব গুরুত্বপূর্ণ পয়েন্ট বিবেচনা করা যে পূর্ণসংখ্যা পার্সার NumberFormatException ছোঁড়ার যেমন বিবৃত করা হয় Javadoc

int foo;
String StringThatCouldBeANumberOrNot = "26263Hello"; //will throw exception
String StringThatCouldBeANumberOrNot2 = "26263"; //will not throw exception
try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot);
} catch (NumberFormatException e) {
      //Will Throw exception!
      //do something! anything to handle the exception.
}

try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot2);
} catch (NumberFormatException e) {
      //No problem this time, but still it is good practice to care about exceptions.
      //Never trust user input :)
      //Do something! Anything to handle the exception.
}

বিভক্ত আর্গুমেন্টগুলি থেকে পূর্ণসংখ্যার মানগুলি অর্জন করার সময় বা কিছুকে গতিশীলভাবে পার্স করার সময় এই ব্যতিক্রমটি পরিচালনা করা গুরুত্বপূর্ণ important


আমি কীভাবে "26263 হেলো" পার্স করতে পারি? আমি সেক্ষেত্রে 26263 টি বের করতে চাই
idlassv 463035818

1
@ user463035818 - দেখুন docs.oracle.com/javase/8/docs/api/java/util/regex/... - একটি নিয়মিত expresssion প্যাটার্ন "([0-9]+)"ইচ্ছা "ক্যাপচার" নয়টি মাধ্যমে এক অথবা তার বেশি সংখ্যার এক প্রথম অনুক্রম। Matcherসেই প্যাকেজের ক্লাসটি দেখুন ।
মার্ক স্টিয়ার্ট

83

এটি ম্যানুয়ালি করুন:

public static int strToInt( String str ){
    int i = 0;
    int num = 0;
    boolean isNeg = false;

    //Check for negative sign; if it's there, set the isNeg flag
    if (str.charAt(0) == '-') {
        isNeg = true;
        i = 1;
    }

    //Process each character of the string;
    while( i < str.length()) {
        num *= 10;
        num += str.charAt(i++) - '0'; //Minus the ASCII code of '0' to get the value of the charAt(i++).
    }

    if (isNeg)
        num = -num;
    return num;
}

21
ইনপুটটি 2 ^ 32 এর চেয়ে বেশি হলে কী হবে? ইনপুটটিতে যদি সংখ্যাসূচক অক্ষর থাকে তবে কী হবে?
yohm

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

42
-1 দুঃখিত, তবে এটি একটি দরিদ্র অ্যালগরিদম, প্রচুর সীমাবদ্ধতা, কোনও ত্রুটি পরিচালনা এবং কিছু অদ্ভুত অসঙ্গতিগুলি (উদাহরণস্বরূপ "" একটি ব্যতিক্রম দেয়, "-" 0 এবং "+" উত্পাদন করে)। কেন কেউ এটিকে বেছে নেবে Integer.parseInt(s)? - আমি এটি একটি সাক্ষাত্কারের প্রশ্ন হওয়ার বিষয়টি দেখছি, তবে ক) যা বোঝায় না যে আপনি এটি এভাবেই করতেন (যা প্রশ্নকারী জিজ্ঞাসা করেছিলেন), এবং খ) যাইহোক, এই উত্তরটি একটি খুব খারাপ উদাহরণ।
সুসানডাব্লু

1
-1 কারণ আমি যদি একটি বেস 31 ইন্টের পার্স করতে চাই? Integer.parseInt (str, 31) এটি করার জন্য একটি লাইনার। সামান্য সামান্য মন্তব্য, কিন্তু নীচে গুরুতর পয়েন্ট। অন্য কেউ ইতিমধ্যে কাজটি স্থাপন করার সময় চাকাগুলির পুনরায় উদ্ভাবন করবেন না
নাথান অ্যাডামস

1
এই কোডটি দেখে মনে হচ্ছে এটি প্রতিযোগিতামূলক প্রোগ্রামিং প্রতিযোগিতায় দ্রুত আইওর জন্য একটি পরিচিত গ্রন্থাগার থেকে রূপান্তরিত হয়েছিল। সেই প্রসঙ্গে ইনপুট ডেটা বৈধ হওয়ার গ্যারান্টিযুক্ত এবং সমাধানগুলি গতিতে গ্রেড করা হয়। এটির চেয়ে কোনও দ্রুত হওয়া উচিত Integer.parseInt কারণ এটির কোনও বৈধতা নেই।
কেয়া 3

53

বিকল্প সমাধান হ'ল অ্যাপাচি কমন্সের নম্বর ইউটিগুলি ব্যবহার করা :

int num = NumberUtils.toInt("1234");

অ্যাপাচি ইউটিলিটিটি দুর্দান্ত কারণ স্ট্রিংটি যদি একটি অবৈধ সংখ্যা বিন্যাস হয় তবে 0 সর্বদা ফিরে আসে। অতএব আপনি চেষ্টা ব্লক সংরক্ষণ।

অ্যাপাচি নম্বরের ব্যবহারের API সংস্করণ 3.4 3.


33
আপনি যখনই অবৈধ সংখ্যা বিশ্লেষণ করবেন তখন খুব কমই 0 ব্যবহার করতে চান।
15-18

4
শূন্য যা জাভা একটি ডিফল্ট হিসাবে ব্যবহার করে যদি কোনও বস্তুর কোনও int ক্ষেত্র সেট না করা থাকে। সুতরাং যে শ্রদ্ধায় এটি জ্ঞান করে।
রাইফোফ্লাভিন

14
@ রাইবোফ্লাভিন না, এটি হয় না। এর মধ্যে একটি হ'ল একটি সংজ্ঞায়িত ভাষা শব্দার্থক, এবং অন্যটি ব্যতিক্রম
ইথারাস

44

বর্তমানে আমি কলেজের জন্য একটি অ্যাসাইনমেন্ট করছি, যেখানে আমি উপরের মত কিছু নির্দিষ্ট এক্সপ্রেশন ব্যবহার করতে পারি না এবং এএসসিআইআই টেবিলটি দেখে আমি এটি করতে সক্ষম হয়েছি। এটি একটি আরও জটিল কোড, তবে এটি আমার মতো সীমাবদ্ধ অন্যকে সহায়তা করতে পারে।

প্রথম কাজটি হ'ল ইনপুট গ্রহণ করা, এই ক্ষেত্রে, অঙ্কগুলির একটি স্ট্রিং; আমি এটি কল করব String numberএবং এই ক্ষেত্রে আমি 12 নম্বর ব্যবহার করে এটি উদাহরণ দিয়ে দেবString number = "12";

আর একটি সীমাবদ্ধতা হ'ল আমি পুনরাবৃত্ত চক্র ব্যবহার করতে পারি না, অতএব, একটি forচক্র (যা নিখুঁত হতে পারে) হয় না ব্যবহার করা যায় না। এটি আমাদের কিছুটা সীমাবদ্ধ করে, তবে তারপরে আবার লক্ষ্য। যেহেতু আমার কেবল দুটি অঙ্কের প্রয়োজন (শেষ দুটি অঙ্ক নেওয়া), একটি সহজ charAtসমাধান করেছে:

 // Obtaining the integer values of the char 1 and 2 in ASCII
 int semilastdigitASCII = number.charAt(number.length()-2);
 int lastdigitASCII = number.charAt(number.length()-1);

কোডগুলি থাকা, আমাদের কেবল টেবিলটি সন্ধান করা এবং প্রয়োজনীয় সমন্বয় করা দরকার:

 double semilastdigit = semilastdigitASCII - 48;  //A quick look, and -48 is the key
 double lastdigit = lastdigitASCII - 48;

এখন, কেন দ্বিগুণ? ঠিক আছে, কারণ সত্যই একটি "অদ্ভুত" পদক্ষেপ। বর্তমানে আমাদের দুটি ডাবল রয়েছে, 1 এবং 2, তবে আমাদের এটিকে 12 এ পরিণত করা দরকার, এমন কোনও গাণিতিক ক্রিয়াকলাপ নেই যা আমরা করতে পারি।

আমরা পরেরটি (লাস্ট ডিজিট) 10 কে 2/10 = 0.2এভাবে ফ্যাশনে ভাগ করছি (সুতরাং কেন দ্বিগুণ):

 lastdigit = lastdigit/10;

এটি নিছক সংখ্যা নিয়ে খেলছে। আমরা শেষ অঙ্কটিকে দশমিক দশকে পরিণত করছিলাম। তবে এখন দেখুন কী ঘটে:

 double jointdigits = semilastdigit + lastdigit; // 1.0 + 0.2 = 1.2

অঙ্কে খুব বেশি না গিয়ে, আমরা কেবলমাত্র সংখ্যার অঙ্কগুলি ইউনিটকে পৃথক করে দিই। আপনি দেখুন, যেহেতু আমরা কেবল 0-9 বিবেচনা করি, 10 এর একাধিক দ্বারা ভাগ করা "বাক্স" তৈরি করার মতো যেখানে আপনি এটি সংরক্ষণ করেন (যখন আপনার প্রথম গ্রেডের শিক্ষক আপনাকে ইউনিট এবং একশত কী ছিল তখন ব্যাখ্যা করেছিলেন)। তাই:

 int finalnumber = (int) (jointdigits*10); // Be sure to use parentheses "()"

এবং আপনি সেখানে যান। আপনি নিম্নলিখিত সীমাবদ্ধতা বিবেচনা করে, এই দুটি অঙ্কের সমন্বিত সংখ্যায় (এই ক্ষেত্রে, দুটি অঙ্ক) একটি স্ট্রিং পরিণত করেছেন:

  • কোনও পুনরাবৃত্ত চক্র নেই
  • পার্সিয়ান্টের মতো কোনও "ম্যাজিক" এক্সপ্রেশন নেই

7
কোনও পূর্ণসংখ্যাকে পার্স করার জন্য টাইপ ডাবল ব্যবহার করা কেবলমাত্র খারাপ ধারণা পারফরম্যান্স অনুযায়ী নয়। 0.2 এর মতো মানগুলি ভাসমান-পয়েন্ট উপস্থাপনে পর্যায়ক্রমিক সংখ্যা এবং যথাযথভাবে উপস্থাপন করা যায় না। পয়েন্টটি দেখতে System.out.println (0.1 + 0.2) ব্যবহার করে দেখুন - ফলাফল 0.3 হবে না! আপনি যেভাবে লাইব্রেরি কোডের সাথে ভাল স্টিক লাগাতে পারেন, এক্ষেত্রে Integer.parseInt ()।
ক্রিসবি

9
এই উত্তরটি কোন ধরণের সমস্যার সমাধান করার চেষ্টা করে তা স্পষ্ট নয়, প্রথমত, কারও কারও কাছে কখনই এই বিধিনিষেধ বর্ণনা করা উচিত, দ্বিতীয়ত, আপনাকে কেন ASCII টেবিলটি দেখতে হবে কারণ আপনি কেবল '0'চরিত্রটির পরিবর্তে ব্যবহার করতে পারেন 48এবং কখনই করতে হবে না এর আসল সংখ্যাসূচক মান নিয়ে বিরক্ত করুন। তৃতীয়ত, doubleদশটি দিয়ে দশকের সাথে ভাগ করে, দশটি দিয়ে ভাগ করে নেওয়ার সাথে মানগুলির সাথে পুরো পথটি মোটেই বোঝা যায় না। semilastdigit * 10 + lastdigitদশমিক ব্যবস্থা চালু হওয়ার পরে ফলাফলটি প্রাথমিক বিদ্যালয়ে যেমন শিখেছিল ...
হোলগার

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

কেন 10 দিয়ে সমস্ত কিছু ভাগ করে তারপরে আবার 10 দিয়ে গুণিত করুন ?! তদ্ব্যতীত, "পার্সিয়ান্ট" যাদু নয় এবং এটি কোনও অভিব্যক্তি নয়, এটি একটি ইনবিল্ট লাইব্রেরি ফাংশন যা প্রায় 3 দশক ধরে পরীক্ষিত এবং প্রমাণিত হয়েছে
নাথান অ্যাডামস

1
এটি একটি ভাল উত্তর নয়। প্রশ্নটি হল "আমি কীভাবে একটি স্ট্রিংটিকে জাভাতে অন্তর্নিবিষ্ট করব?" না, "আমি কীভাবে এই গৃহকর্মের সমস্যাটি স্বেচ্ছাচারী বিধিনিষেধের সাথে সমাধান করব?" এটি স্ট্যাকওভারফ্লো, হোম ওয়ার্ক ওভারফ্লো নয়।
ডেভিডএস

37

Integer.decode

আপনি ব্যবহার করতে পারেন public static Integer decode(String nm) throws NumberFormatException

এটি 8 এবং 16 বেসের জন্যও কাজ করে:

// base 10
Integer.parseInt("12");     // 12 - int
Integer.valueOf("12");      // 12 - Integer
Integer.decode("12");       // 12 - Integer
// base 8
// 10 (0,1,...,7,10,11,12)
Integer.parseInt("12", 8);  // 10 - int
Integer.valueOf("12", 8);   // 10 - Integer
Integer.decode("012");      // 10 - Integer
// base 16
// 18 (0,1,...,F,10,11,12)
Integer.parseInt("12",16);  // 18 - int
Integer.valueOf("12",16);   // 18 - Integer
Integer.decode("#12");      // 18 - Integer
Integer.decode("0x12");     // 18 - Integer
Integer.decode("0X12");     // 18 - Integer
// base 2
Integer.parseInt("11",2);   // 3 - int
Integer.valueOf("11",2);    // 3 - Integer

intপরিবর্তে পেতে চাইলে আপনি Integerব্যবহার করতে পারেন:

  1. আনবক্সিং:

    int val = Integer.decode("12"); 
  2. intValue():

    Integer.decode("12").intValue();

অবশেষে! যে কেউ আসলে রূপান্তরগুলির ফলাফল / আউটপুট পোস্ট করতে বিরক্ত করে! আপনি কি "-" চিহ্নগুলি দিয়ে কিছু যুক্ত করতে পারেন?
not2qubit

29

যখনই এই সামান্যতম সম্ভাবনা থাকে যে প্রদত্ত স্ট্রিংটিতে কোনও পূর্ণসংখ্যা থাকে না, আপনাকে এই বিশেষ কেসটি পরিচালনা করতে হবে। দুঃখের বিষয়, আদর্শ জাভা পদ্ধতি Integer::parseIntএবং এই বিশেষ ক্ষেত্রে সংকেত দিতে Integer::valueOfএকটি নিক্ষেপ করুন NumberFormatException। সুতরাং, আপনাকে প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রম ব্যবহার করতে হবে, যা সাধারণত খারাপ কোডিং শৈলী হিসাবে বিবেচিত হয়।

আমার মতে, এই বিশেষ কেসটি খালি ফিরে দিয়ে পরিচালনা করা উচিত Optional<Integer>। যেহেতু জাভা এই জাতীয় পদ্ধতি প্রস্তাব করে না, আমি নিম্নলিখিত র‍্যাপারটি ব্যবহার করি:

private Optional<Integer> tryParseInteger(String string) {
    try {
        return Optional.of(Integer.valueOf(string));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}

ব্যবহারের উদাহরণ:

// prints "12"
System.out.println(tryParseInteger("12").map(i -> i.toString()).orElse("invalid"));
// prints "-1"
System.out.println(tryParseInteger("-1").map(i -> i.toString()).orElse("invalid"));
// prints "invalid"
System.out.println(tryParseInteger("ab").map(i -> i.toString()).orElse("invalid"));

এটি অভ্যন্তরীণভাবে প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রমগুলি ব্যবহার করার সময়, ব্যবহারের কোডটি খুব পরিষ্কার হয়ে যায়। এছাড়াও, আপনি যে মামলাটি -1বৈধ মান হিসাবে পার্স করা হয়েছে এবং যে ক্ষেত্রে কোনও অবৈধ স্ট্রিংকে বিশ্লেষণ করা যায়নি তা আপনি পরিষ্কারভাবে আলাদা করতে পারেন ।


24

একটি স্ট্রিংকে একটি ইনটে রূপান্তর করা কেবল একটি সংখ্যার রূপান্তর চেয়ে জটিল। আপনি নিম্নলিখিত বিষয়গুলি সম্পর্কে চিন্তাভাবনা করেছেন:

  • স্ট্রিংয়ে কেবল 0-9 নম্বর রয়েছে ?
  • স্ট্রিংয়ের আগে বা পরে - / + দিয়ে কী হবে ? এটি কি সম্ভব (অ্যাকাউন্টিং নম্বরগুলি উল্লেখ করে)?
  • MAX _- / MIN_INFINITY নিয়ে কী হবে ? স্ট্রিংটি 99999999999999999999 হলে কী হবে? মেশিনটি কি এই স্ট্রিংটিকে ইন্ট হিসাবে বিবেচনা করতে পারে?

1
হ্যাঁ - এবং -2 ^ 31 এর কাছাকাছি একটি বাজে প্রান্তের কেস রয়েছে। যদি আপনি 2 ^ 31
অবহেলা করার

24

এটি করার পদ্ধতিগুলি:

 1. Integer.parseInt(s)
 2. Integer.parseInt(s, radix)
 3. Integer.parseInt(s, beginIndex, endIndex, radix)
 4. Integer.parseUnsignedInt(s)
 5. Integer.parseUnsignedInt(s, radix)
 6. Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
 7. Integer.valueOf(s)
 8. Integer.valueOf(s, radix)
 9. Integer.decode(s)
 10. NumberUtils.toInt(s)
 11. NumberUtils.toInt(s, defaultValue)

Integer.valueOf পূর্ণসংখ্যার অবজেক্ট তৈরি করে, অন্যান্য সমস্ত পদ্ধতি - আদিম ইনট।

Commons-lang3 এবং এখানে রূপান্তর সম্পর্কে বড় নিবন্ধ থেকে শেষ 2 টি পদ্ধতি ।


22

স্ট্রিংয়ের মানটিকে পূর্ণসংখ্যার মান রূপান্তর parseInt(String str)করার জন্য আমরা Integerমোড়ক ক্লাসের পদ্ধতিটি ব্যবহার করতে পারি ।

উদাহরণ স্বরূপ:

String strValue = "12345";
Integer intValue = Integer.parseInt(strVal);

Integerবর্গ এছাড়াও উপলব্ধ valueOf(String str)পদ্ধতি:

String strValue = "12345";
Integer intValue = Integer.valueOf(strValue);

আমরা ব্যবহার করতে পারেন toInt(String strValue)এর NumberUtils ইউটিলিটি ক্লাস রূপান্তর জন্য:

String strValue = "12345";
Integer intValue = NumberUtils.toInt(strValue);

22

ব্যবহার Integer.parseInt(yourString)

নিম্নলিখিত জিনিসগুলি মনে রাখবেন:

Integer.parseInt("1"); // ঠিক আছে

Integer.parseInt("-1"); // ঠিক আছে

Integer.parseInt("+1"); // ঠিক আছে

Integer.parseInt(" 1"); // ব্যতিক্রম (ফাঁকা জায়গা)

Integer.parseInt("2147483648");// ব্যতিক্রম (পূর্ণসংখ্যার সর্বাধিক মূল্য 2,147,483,647 সীমাবদ্ধ )

Integer.parseInt("1.1");// ব্যতিক্রম ( বা , বা যা অনুমোদিত নয়)

Integer.parseInt(""); // ব্যতিক্রম (0 বা কিছু নয়)

ব্যতিক্রম শুধুমাত্র এক প্রকার: NumberFormatException


এখানে অন্তর্নির্মিত সর্বাধিক মানটিও একটি নম্বর ফরমেট এক্সেক্সশন দেয়?
কোডিং ওয়াম্বাট

না, সর্বাধিক মান স্টিল ঠিক আছে
Lukas Bauer

19

আমার একটি সমাধান আছে, তবে আমি জানি না এটি কতটা কার্যকর। তবে এটি কার্যকরভাবে কাজ করে এবং আমি মনে করি আপনি এটি উন্নতি করতে পারেন। অন্যদিকে, আমি JUnit এর সাথে বেশ কয়েকটি পরীক্ষা করেছি যা সঠিকভাবে ধাপে। আমি ফাংশন এবং পরীক্ষা সংযুক্ত করেছি:

static public Integer str2Int(String str) {
    Integer result = null;
    if (null == str || 0 == str.length()) {
        return null;
    }
    try {
        result = Integer.parseInt(str);
    } 
    catch (NumberFormatException e) {
        String negativeMode = "";
        if(str.indexOf('-') != -1)
            negativeMode = "-";
        str = str.replaceAll("-", "" );
        if (str.indexOf('.') != -1) {
            str = str.substring(0, str.indexOf('.'));
            if (str.length() == 0) {
                return (Integer)0;
            }
        }
        String strNum = str.replaceAll("[^\\d]", "" );
        if (0 == strNum.length()) {
            return null;
        }
        result = Integer.parseInt(negativeMode + strNum);
    }
    return result;
}

জুনিতের সাথে পরীক্ষা করা:

@Test
public void testStr2Int() {
    assertEquals("is numeric", (Integer)(-5), Helper.str2Int("-5"));
    assertEquals("is numeric", (Integer)50, Helper.str2Int("50.00"));
    assertEquals("is numeric", (Integer)20, Helper.str2Int("$ 20.90"));
    assertEquals("is numeric", (Integer)5, Helper.str2Int(" 5.321"));
    assertEquals("is numeric", (Integer)1000, Helper.str2Int("1,000.50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int("0.50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int(".50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int("-.10"));
    assertEquals("is numeric", (Integer)Integer.MAX_VALUE, Helper.str2Int(""+Integer.MAX_VALUE));
    assertEquals("is numeric", (Integer)Integer.MIN_VALUE, Helper.str2Int(""+Integer.MIN_VALUE));
    assertEquals("Not
     is numeric", null, Helper.str2Int("czv.,xcvsa"));
    /**
     * Dynamic test
     */
    for(Integer num = 0; num < 1000; num++) {
        for(int spaces = 1; spaces < 6; spaces++) {
            String numStr = String.format("%0"+spaces+"d", num);
            Integer numNeg = num * -1;
            assertEquals(numStr + ": is numeric", num, Helper.str2Int(numStr));
            assertEquals(numNeg + ": is numeric", numNeg, Helper.str2Int("- " + numStr));
        }
    }
}

আপনি এটি আরও সহজ করতে পারেন:(int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
ডেভিড হরভ্থ


17

আপনি সমস্ত অ সংখ্যাগত অক্ষর মুছে ফেলা এবং তারপরে পূর্ণসংখ্যাকে পার্স করে শুরু করতে পারেন:

String mystr = mystr.replaceAll("[^\\d]", "");
int number = Integer.parseInt(mystr);

তবে সতর্ক হতে হবে যে এটি কেবল অ-নেতিবাচক সংখ্যার জন্যই কাজ করে।


18
এটি -42হিসাবে পার্স হওয়ার কারণ ঘটবে 42

10
হ্যাঁ, এটি কেবলমাত্র নেতিবাচক সংখ্যার জন্যই কাজ করে যা শুরু করা সঠিক এবং তাই, এই প্রতিস্থাপন পদক্ষেপের দরকার নেই don't অন্য প্রতিটি ক্ষেত্রে, স্বয়ংক্রিয়ভাবে এটি ঠিক করার এই প্রয়াসটি বিষয়গুলিকে আরও খারাপ করে দেবে (প্রায় প্রতিটি প্রচেষ্টা স্বয়ংক্রিয়ভাবে কোনও কিছু ঠিক করার জন্য)। আমি যদি পাস করে যাই তবে আমি যা করার চেষ্টা করেছি তা ভ্রান্ত ছিল সে সম্পর্কে কোনও ইঙ্গিত ছাড়াই ফলস্বরূপ "4+2"পাব 42। ব্যবহারকারীর ধারণাটি পাওয়া যাবে যে প্রাথমিক মত প্রকাশ করা যেমন 4+2একটি বৈধ ইনপুট ছিল তবে অ্যাপ্লিকেশনটি একটি ভুল মান দিয়ে চালিয়ে যাচ্ছে। তদ্ব্যতীত, প্রকারটি String, নয় string...
হোলগার

অথবা প্রথম লাইনটি পরিবর্তন করুন -> স্ট্রিং মাইরিস্ট = মাইস্টআর রিপ্লেসএল ("[^ \\ d \\ -]", "");
এপিএম

13

পূর্ববর্তী উত্তরগুলি বাদে আমি বেশ কয়েকটি ফাংশন যুক্ত করতে চাই। আপনি এগুলি ব্যবহার করার সময় এগুলি ফলাফল:

public static void main(String[] args) {
  System.out.println(parseIntOrDefault("123", 0)); // 123
  System.out.println(parseIntOrDefault("aaa", 0)); // 0
  System.out.println(parseIntOrDefault("aaa456", 3, 0)); // 456
  System.out.println(parseIntOrDefault("aaa789bbb", 3, 6, 0)); // 789
}

বাস্তবায়ন:

public static int parseIntOrDefault(String value, int defaultValue) {
  int result = defaultValue;
  try {
    result = Integer.parseInt(value);
  }
  catch (Exception e) {
  }
  return result;
}

public static int parseIntOrDefault(String value, int beginIndex, int defaultValue) {
  int result = defaultValue;
  try {
    String stringValue = value.substring(beginIndex);
    result = Integer.parseInt(stringValue);
  }
  catch (Exception e) {
  }
  return result;
}

public static int parseIntOrDefault(String value, int beginIndex, int endIndex, int defaultValue) {
  int result = defaultValue;
  try {
    String stringValue = value.substring(beginIndex, endIndex);
    result = Integer.parseInt(stringValue);
  }
  catch (Exception e) {
  }
  return result;
}

10

উল্লিখিত হিসাবে, অ্যাপাচি কমন্স ' NumberUtilsএটি করতে পারে। এটি 0যদি স্ট্রিংকে কোন ইনটে রূপান্তর করতে না পারে তবে তা ফিরে আসে ।

আপনি নিজের ডিফল্ট মানটিও সংজ্ঞায়িত করতে পারেন:

NumberUtils.toInt(String str, int defaultValue)

উদাহরণ:

NumberUtils.toInt("3244", 1) = 3244
NumberUtils.toInt("", 1)     = 1
NumberUtils.toInt(null, 5)   = 5
NumberUtils.toInt("Hi", 6)   = 6
NumberUtils.toInt(" 32 ", 1) = 1 // Space in numbers are not allowed
NumberUtils.toInt(StringUtils.trimToEmpty("  32 ", 1)) = 32;

9

আপনি কিছু সতর্কতা সহ এই কোডটিও ব্যবহার করতে পারেন।

  • বিকল্প # 1: ব্যতিক্রমটি স্পষ্টভাবে পরিচালনা করুন, উদাহরণস্বরূপ, একটি বার্তা ডায়ালগ দেখানো এবং তারপরে বর্তমান ওয়ার্কফ্লোটি কার্যকর করা বন্ধ করুন। উদাহরণ স্বরূপ:

    try
        {
            String stringValue = "1234";
    
            // From String to Integer
            int integerValue = Integer.valueOf(stringValue);
    
            // Or
            int integerValue = Integer.ParseInt(stringValue);
    
            // Now from integer to back into string
            stringValue = String.valueOf(integerValue);
        }
    catch (NumberFormatException ex) {
        //JOptionPane.showMessageDialog(frame, "Invalid input string!");
        System.out.println("Invalid input string!");
        return;
    }
  • বিকল্প # 2: যদি ব্যতিক্রমের ক্ষেত্রে কার্যকর করা প্রবাহ অব্যাহত রাখতে পারে তবে প্রভাবিত পরিবর্তনশীলটিকে পুনরায় সেট করুন। উদাহরণস্বরূপ, ক্যাচ ব্লকে কিছু পরিবর্তন সহ

    catch (NumberFormatException ex) {
        integerValue = 0;
    }

তুলনা বা যেকোন ধরণের কম্পিউটিংয়ের জন্য স্ট্রিং ধ্রুবক ব্যবহার করা সর্বদা একটি ভাল ধারণা, কারণ একটি ধ্রুবক কখনই নাল মান দেয় না।


4
ফেলে JOptionPane.showMessageDialog()ভ্যানিলা জাভা প্রশ্নের উত্তরে কোন মানে নেই।
জন হাস্কল

2
Integer.valueOf(String);প্রকার ফিরে আসে না int
php_coder_3809625


9

প্রোগ্রামিং প্রতিযোগিতায়, যেখানে আপনি নিশ্চিত হয়ে থাকেন যে নম্বরটি সর্বদা বৈধ পূর্ণসংখ্যার হয়ে থাকে, তারপরে আপনি ইনপুট পার্স করার জন্য নিজের পদ্ধতি লিখতে পারেন। এটি সমস্ত বৈধতা সম্পর্কিত কোডটি এড়িয়ে যাবে (যেহেতু আপনার কোনওটির প্রয়োজন নেই) এবং এটি আরও কার্যকর হবে be

  1. বৈধ ধনাত্মক পূর্ণসংখ্যার জন্য:

    private static int parseInt(String str) {
        int i, n = 0;
    
        for (i = 0; i < str.length(); i++) {
            n *= 10;
            n += str.charAt(i) - 48;
        }
        return n;
    }
  2. ধনাত্মক এবং নেতিবাচক উভয় পূর্ণসংখ্যার জন্য:

    private static int parseInt(String str) {
        int i=0, n=0, sign=1;
        if (str.charAt(0) == '-') {
            i = 1;
            sign = -1;
        }
        for(; i<str.length(); i++) {
            n* = 10;
            n += str.charAt(i) - 48;
        }
        return sign*n;
    }
  3. যদি আপনি এই সংখ্যাগুলির আগে বা পরে কোনও শ্বেত স্পেসের প্রত্যাশা করে থাকেন, তবে str = str.trim()আরও প্রক্রিয়া করার আগে অবশ্যই কিছু নিশ্চিত করুন ।


7

কেবল আপনি এটি চেষ্টা করতে পারেন:

  • ব্যবহার করুন Integer.parseInt(your_string);একটি রূপান্তর করতে Stringকরতেint
  • ব্যবহার করুন Double.parseDouble(your_string);একটি রূপান্তর করতে Stringকরতেdouble

উদাহরণ

String str = "8955";
int q = Integer.parseInt(str);
System.out.println("Output>>> " + q); // Output: 8955

String str = "89.55";
double q = Double.parseDouble(str);
System.out.println("Output>>> " + q); // Output: 89.55

এই উত্তরটি কয়েক বছর আগে পোস্ট করা Integer.parseInt এর সুপারিশ করা উত্তরের বাইরে কিছু যুক্ত করে না বলে মনে হয় (স্ট্রিংকে ডাবলে রূপান্তর করা একটি আলাদা প্রশ্ন হবে )।
বার্নহার্ড বার্কার

7

সাধারণ স্ট্রিংয়ের জন্য আপনি ব্যবহার করতে পারেন:

int number = Integer.parseInt("1234");

স্ট্রিং নির্মাতা এবং স্ট্রিং বাফারের জন্য আপনি ব্যবহার করতে পারেন:

Integer.parseInt(myBuilderOrBuffer.toString());

6
int foo=Integer.parseInt("1234");

নিশ্চিত হয়ে নিন যে স্ট্রিংটিতে কোনও অ-সংখ্যাযুক্ত ডেটা নেই।


5
এটি নির্বাচিত উত্তর হিসাবে ঠিক একই।
স্টিভ স্মিথ

5
আপনার আগে কেউ অন্য পাঁচটি বছর পোস্ট করেছে এমন উত্তরটি পুনরাবৃত্তি করার ক্ষেত্রে সাইটের কোনও মূল্য নেই।
দাউদ ইবনে কেরেম

এটি ইতিমধ্যে গৃহীত উত্তরে covered াকা রয়েছে (প্রায় 5 বছর পূর্বে পোস্ট করা হয়েছে)।
পিটার মর্টেনসেন

6

আমি খানিকটা অবাক হয়েছি যে কেউ স্ট্রিংকে প্যারামিটার হিসাবে গ্রহণ করে এমন পূর্ণসংখ্যা কন্সট্রাক্টরের কথা উল্লেখ করেনি।

সুতরাং, এটি এখানে:

String myString = "1234";
int i1 = new Integer(myString);

জাভা 8 - পূর্ণসংখ্যা (স্ট্রিং)

অবশ্যই, কনস্ট্রাক্টর টাইপ ফিরে আসবে Integerএবং একটি আনবক্সিং অপারেশন মানটিকে রূপান্তর করে int


এটি উল্লেখ করা গুরুত্বপূর্ণ : এই নির্মাণকারী parseIntপদ্ধতিটি কল করে the

public Integer(String var1) throws NumberFormatException {
    this.value = parseInt(var1, 10);
}

5

Integer.parseInt () ব্যবহার করুন এবং try...catchকোনও সংখ্যাসূচক অক্ষর প্রবেশ করানোর ক্ষেত্রে কোনও ত্রুটি হ্যান্ডেল করতে এটি একটি ব্লকের ভিতরে রাখুন , উদাহরণস্বরূপ,

private void ConvertToInt(){
    String string = txtString.getText();
    try{
        int integerValue=Integer.parseInt(string);
        System.out.println(integerValue);
    }
    catch(Exception e){
       JOptionPane.showMessageDialog(
         "Error converting string to integer\n" + e.toString,
         "Error",
         JOptionPane.ERROR_MESSAGE);
    }
 }


5

এটি সাতটি উপায়ে করা যেতে পারে:

import com.google.common.primitives.Ints;
import org.apache.commons.lang.math.NumberUtils;

String number = "999";

1) ব্যবহার Ints.tryParse:

int result = Ints.tryParse(number);

2) ব্যবহার NumberUtils.createInteger:

Integer result = NumberUtils.createInteger(number);

3) ব্যবহার NumberUtils.toInt:

int result = NumberUtils.toInt(number);

4) ব্যবহার Integer.valueOf:

Integer result = Integer.valueOf(number);

5) ব্যবহার Integer.parseInt:

int result = Integer.parseInt(number);

6) ব্যবহার Integer.decode:

int result = Integer.decode(number);

7) ব্যবহার Integer.parseUnsignedInt:

int result = Integer.parseUnsignedInt(number);

সংখ্যা ইউটিলে নাল এবং ফাঁকা দৃশ্যের পাশাপাশি পরিচালনা করে।
সুন্দররাজ গোবিন্দসামি

5

একটি পদ্ধতি পার্সিয়ান্ট (স্ট্রিং)। এটি একটি আদিম অন্তর্গঠন ফিরিয়ে দেয়:

String number = "10";
int result = Integer.parseInt(number);
System.out.println(result);

দ্বিতীয় পদ্ধতিটি মানফল (স্ট্রিং), এবং এটি একটি নতুন পূর্ণসংখ্যা () অবজেক্টটি প্রদান করে:

String number = "10";
Integer result = Integer.valueOf(number);
System.out.println(result);

এটি কি পূর্ববর্তী উত্তরে coveredাকা নেই?
পিটার মর্টেনসেন

4

আপনি নিম্নলিখিত যে কোনও ব্যবহার করতে পারেন:

  1. Integer.parseInt(s)
  2. Integer.parseInt(s, radix)
  3. Integer.parseInt(s, beginIndex, endIndex, radix)
  4. Integer.parseUnsignedInt(s)
  5. Integer.parseUnsignedInt(s, radix)
  6. Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
  7. Integer.valueOf(s)
  8. Integer.valueOf(s, radix)
  9. Integer.decode(s)
  10. NumberUtils.toInt(s)
  11. NumberUtils.toInt(s, defaultValue)

4

এটি একটি লাইব্রেরি ব্যবহার না করে সমস্ত অবস্থার ইতিবাচক এবং নেতিবাচক সমেত একটি সম্পূর্ণ প্রোগ্রাম

import java.util.Scanner;


public class StringToInt {

    public static void main(String args[]) {
        String inputString;
        Scanner s = new Scanner(System.in);
        inputString = s.nextLine();

        if (!inputString.matches("([+-]?([0-9]*[.])?[0-9]+)")) {
            System.out.println("Not a Number");
        }
        else {
            Double result2 = getNumber(inputString);
            System.out.println("result = " + result2);
        }
    }


    public static Double getNumber(String number) {
        Double result = 0.0;
        Double beforeDecimal = 0.0;
        Double afterDecimal = 0.0;
        Double afterDecimalCount = 0.0;
        int signBit = 1;
        boolean flag = false;

        int count = number.length();
        if (number.charAt(0) == '-') {
            signBit = -1;
            flag = true;
        }
        else if (number.charAt(0) == '+') {
            flag = true;
        }
        for (int i = 0; i < count; i++) {
            if (flag && i == 0) {
                continue;
            }
            if (afterDecimalCount == 0.0) {
                if (number.charAt(i) - '.' == 0) {
                    afterDecimalCount++;
                }
                else {
                    beforeDecimal = beforeDecimal * 10 + (number.charAt(i) - '0');
                }
            }
            else {
                afterDecimal = afterDecimal * 10 + number.charAt(i) - ('0');
                afterDecimalCount = afterDecimalCount * 10;
            }
        }
        if (afterDecimalCount != 0.0) {
            afterDecimal = afterDecimal / afterDecimalCount;
            result = beforeDecimal + afterDecimal;
        }
        else {
            result = beforeDecimal;
        }
        return result * signBit;
    }
}

2
চাকাটি পুনরায় উদ্ভাবনের দরকার নেই, কেবল ব্যবহার করুন Integer.parseInt
ডোরিয়ান গ্রে

@ টোবিয়াস উইমার হ্যাঁ, আমরা এটি করতে পারি তবে এটি লাইব্রেরি ব্যবহার না করেই হয়
অনুপ গুপ্ত

@ তোবিয়াস উইমার, কিছু লোকের লাইব্রেরি ব্যবহার না করে কীভাবে এটি করা দরকার।
অনুপ গুপ্ত

5
না, কারও এটির প্রয়োজন নেই কারণ এটি জেডিকে-র একটি ফাংশন, কোনও তৃতীয় পক্ষের প্লাগইন নয়।
ডোরিয়ান গ্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.