জাভাতে কোনও স্ট্রিং থেকে অঙ্কগুলি বের করুন


207

আমার একটি জাভা Stringবস্তু আছে। আমার এটি থেকে কেবল অঙ্কগুলি বের করতে হবে। আমি একটি উদাহরণ দেব:

"123-456-789" আমি চাই "123456789"

এমন কোনও লাইব্রেরি ফাংশন রয়েছে যা কেবলমাত্র অঙ্কগুলি বের করে?

উত্তরের জন্য ধন্যবাদ। আমি এগুলি চেষ্টা করার আগে আমার জানতে হবে আমার কোনও অতিরিক্ত লিবিব্রিজ ইনস্টল করতে হবে কিনা?

উত্তর:


545

আপনি রেজেক্স ব্যবহার করতে পারেন এবং অ-অঙ্কগুলি মুছতে পারেন।

str = str.replaceAll("\\D+","");

6
সুন্দর সংক্ষিপ্ত কোড। একটি লিনিয়ার অনুসন্ধান দ্রুত হতে পারে তবে আমি মনে করি আপনার আরও বোধগম্য।
সেপ্টেম্বর

18
আমি অনুমান করি যে আপনি নিজের পছন্দ মতো কিছু ডাউনওয়েট করতে পারবেন (কোনও কট্টর উদ্দেশ্য নয়)। তবে আমার ব্যক্তিগত মতামতটি হ'ল: যখন দুর্দান্ত বিকাশকারীরা (এবং আমাদের এখানে প্রচুর থাকে) তাদের কিছু পরামর্শ নিখরচায় ভাগ করে নিই, তবে আমি সম্মান জানাতে যাচ্ছি, এবং আমি কেবল সত্যই ভয়ঙ্কর জিনিসগুলিকে ডাউনভোট করেছি (আমার প্রোফাইলটি দেখুন, আমার বর্তমানটি দেখুন) অনুপাতটি 17 টি নীচে 14xx আপ) up তবে এটি আমার ব্যক্তিগত দর্শন এবং আপনি নিজের মতামত মুক্ত।
শান প্যাট্রিক ফ্লয়েড

78
আপনার সংখ্যার দশমিক পয়েন্ট থাকলে এটি কাজ করবে না এটি দশমিক পয়েন্টটিও সরিয়ে দেয়। str = str.replaceAll("[^\\.0123456789]","");
অরবিন্দন আর

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

2
এবং যদি আপনাকে দশমিক পয়েন্টের মতো কিছু বাদ দিতে হয়(?!\\.)
আজরাফতী

49

এখানে আরও ভার্বোজের সমাধান। কম মার্জিত, তবে সম্ভবত দ্রুত:

public static String stripNonDigits(
            final CharSequence input /* inspired by seh's comment */){
    final StringBuilder sb = new StringBuilder(
            input.length() /* also inspired by seh's comment */);
    for(int i = 0; i < input.length(); i++){
        final char c = input.charAt(i);
        if(c > 47 && c < 58){
            sb.append(c);
        }
    }
    return sb.toString();
}

পরীক্ষার কোড:

public static void main(final String[] args){
    final String input = "0-123-abc-456-xyz-789";
    final String result = stripNonDigits(input);
    System.out.println(result);
}

আউটপুট:

0123456789

বিটিডাব্লু: আমি ক্যারেক্টার.আইসডিগেট (সিএইচ) ব্যবহার করি নি কারণ এটি 0 - 9 ব্যতীত অন্য অনেক অক্ষর গ্রহণ করে।


4
এটি পুনর্বিবেচনার প্রয়োজন হবে না তা নিশ্চিত করার জন্য আপনার StringBuilderকনস্ট্রাক্টরের (যেমন input.length()) একটি আকার সরবরাহ করা উচিত । আপনার Stringএখানে কোনও দাবি করার দরকার নেই; CharSequenceআল্লাহই যথেষ্ট। এছাড়াও, আপনি StringBuilderঅ-অঙ্কের সংগ্রহ থেকে এর বরাদ্দ আলাদা করতে পারেন একটি পৃথক ফাংশন লিখে যা কোনও CharSequenceইনপুট হিসাবে স্বীকৃতি দেয় এবং Appendableআউটপুট সংগ্রহকারী হিসাবে একটি উদাহরণ।
Seh

1
@ সেগুলি আকর্ষণীয় মনে হচ্ছে তবে মন্তব্য করার পরিবর্তে এক্সটেনশনগুলি দিয়ে নিজের উত্তর তৈরি করবেন না কেন?
রেডইতি

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

2
আমি কাউকে "শাস্তি" দিচ্ছি না - এটি @seh কে আমি যা বলছিলাম তার সম্পূর্ণ ভুল ব্যাখ্যা। আমার বক্তব্যটি হ'ল তাঁর মন্তব্যগুলি এতটা যুক্ত করেছে যা সার্থক ছিল এবং বাস্তবে এতটাই পরিবর্তিত হয়েছিল যে আমি অনুভব করেছি যে এটি তার নিজের একটি উত্তরকে নিশ্চিত করেছে। আমি নিশ্চিত যে সান প্যাট্রিক ফ্লয়েড কেবল অন্যকে সাহায্য করার জন্য কুদোসের সাথে সম্পর্কিত নয় এবং সেহ তার নিজের উত্তর সরবরাহ করে পুরোপুরি খুশি হবে। আমি কেবল সেহকে উত্সাহিত করছিলাম যেহেতু আমি অনুভব করেছি যে তার অবদানটি আরও বেশি দৃশ্যমানতার যোগ্য। অন্য যে কোনও কিছু হিসাবে আমার মন্তব্য পড়ার সম্ভাবনা আমাকে সম্পূর্ণ ধাঁধা দেয় তবে আমি যদি সেভাবে কিছু করে থাকি তবে আমি ক্ষমাপ্রার্থী।
রেডইয়েটি

1
আমি পছন্দ করি যে এই আলোচনাগুলি কীভাবে কিছুক্ষণ সুপ্ত থাকার পরে পঠায়। শোনার উত্তর সম্পাদনা করা আমার পরামর্শগুলির সাথে এটি বাড়িয়ে দেওয়া সম্ভবত আমার পক্ষে এখানে সবচেয়ে ভাল কাজ thing এইভাবে, শন ক্রেডিটটি গ্রহণ করতে থাকবে যদি না উত্তর উত্তরটি সম্প্রদায় উইকির স্থিতিতে রূপান্তর করে।
সেহ

22
public String extractDigits(String src) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < src.length(); i++) {
        char c = src.charAt(i);
        if (Character.isDigit(c)) {
            builder.append(c);
        }
    }
    return builder.toString();
}

আমি নিজেই ক্যারেক্টার.আইডিজিট () ব্যবহার করার কথা ভেবেছিলাম, তবে এটি কিছু অক্ষরও গ্রহণ করে যা 0-9 নয় (ডকস দেখুন: download.oracle.com/javase/6/docs/api/java/lang/… )
শন প্যাট্রিক ফ্লয়েড

21

গুগল পেয়ারা ব্যবহার:

CharMatcher.inRange('0','9').retainFrom("123-456-789")

হালনাগাদ:

প্রম্পম্পিউটেড চারম্যাচার ব্যবহার করে কর্মক্ষমতা আরও উন্নত করতে পারে

CharMatcher ASCII_DIGITS=CharMatcher.inRange('0','9').precomputed();  
ASCII_DIGITS.retainFrom("123-456-789");

3
সেখানে এখন Charmatcher.DIGITপূর্বনির্ধারিত আছে।
ডানকান ম্যাকগ্রিগোর

15
input.replaceAll("[^0-9?!\\.]","")

এটি দশমিক পয়েন্ট উপেক্ষা করবে।

যেমন: আপনার যদি একটি ইনপুট থাকে 445.3kgতবে আউটপুটটি হবে 445.3


আমার কাছে "4.5 জি।" কাজ করে না কারণ এটি দ্বিতীয় রাখে। খুব
মারিয়ান ক্ল্লহস্পিজ

11

গুগল পেয়ারা ব্যবহার:

CharMatcher.DIGIT.retainFrom("123-456-789");

চারম্যাচার প্লাগ-সক্ষম এবং ব্যবহারের জন্য বেশ আকর্ষণীয়, উদাহরণস্বরূপ আপনি নিম্নলিখিতটি করতে পারেন:

String input = "My phone number is 123-456-789!";
String output = CharMatcher.is('-').or(CharMatcher.DIGIT).retainFrom(input);

আউটপুট == 123-456-789


খুব সুন্দর সমাধান (+1), তবে এটি অন্যদের মতো একই সমস্যায় ভুগছে: প্রচুর অক্ষর ইউনিকোড ডিজিট হিসাবে যোগ্যতা অর্জন করে, কেবলমাত্র এসকিআই সংখ্যা নয়। এই কোডটি এই সমস্ত অক্ষর ধরে রাখবে: unicode.org/cldr/utility/list-unicodeset.jsp?a=%5Cp%7Bdigit%7D
সান প্যাট্রিক ফ্লয়েড

@ সানাইজার: তারপরে এটি আরও ভাল CharMatcher.inRange ('1', '9') হবে retain রক্ষণাবেক্ষণ থেকে ("123-456-789")
এমিল

@ এমিল আরও CharMatcher.inRange ('0', '9') এর মতো, তবে: হ্যাঁ
সান প্যাট্রিক ফ্লয়েড

চারম্যাচারের পিছনে ইনরেঞ্জই রয়েছে D ডিজিট; pastie.org/1252471 এটি কেবলমাত্র অ্যাটিশনাল ইউটিএফ নম্বর ব্যাপ্তিতে বিবেচনা করে নেয়, আমি এখনও এগুলি অঙ্ক হিসাবে বিবেচনা করব, যেহেতু বাস্তবে এগুলি, তারা কেবল এএসসিআইআই এনকোডড নয়।
বুজর্নস

আপনি একই উদ্দেশ্যে CharMatcher.JAVA_DIGIT ব্যবহার করতে পারেন, এটি কেবল চরিত্র অনুযায়ী অঙ্কগুলি গ্রহণ করবে
is

6

আপনার প্রয়োজন মেলে নিয়মিত প্রকাশ।

String num,num1,num2;
String str = "123-456-789";
String regex ="(\\d+)";
Matcher matcher = Pattern.compile( regex ).matcher( str);
while (matcher.find( ))
{
num = matcher.group();     
System.out.print(num);                 
}

5

আমি কোড সান প্যাট্রিক ফ্লয়েড দ্বারা অনুপ্রাণিত হয়েছি এবং আমি প্রাপ্ত সর্বোচ্চ পারফরম্যান্সের জন্য এটি আবার নতুন করে লিখি।

public static String stripNonDigitsV2( CharSequence input ) {
    if (input == null)
        return null;
    if ( input.length() == 0 )
        return "";

    char[] result = new char[input.length()];
    int cursor = 0;
    CharBuffer buffer = CharBuffer.wrap( input );

    while ( buffer.hasRemaining() ) {
        char chr = buffer.get();
        if ( chr > 47 && chr < 58 )
            result[cursor++] = chr;
    }

    return new String( result, 0, cursor );
}

আমি পারফরম্যান্স পরীক্ষা করি ন্যূনতম সংখ্যার সাথে খুব দীর্ঘ স্ট্রিংয়ের এবং ফলাফলটি:

  • মূল কোডটি 25,5% ধীর
  • পেয়ারার পদ্ধতির পরিমাণ 2.5-3 গুণ কম
  • ডি + সহ নিয়মিত প্রকাশটি 3-3.5 গুণ ধীর হয়
  • কেবলমাত্র ডি সহ নিয়মিত প্রকাশটি 25+ গুণ ধীর হয়

বিটিডব্লিউ এটি নির্ভর করে যে স্ট্রিংটি কত দীর্ঘ। স্ট্রিংয়ের সাথে কেবলমাত্র 6 টি সংখ্যা রয়েছে পেয়ারা 50% ধীর এবং রেজিএক্সপ্যাক 1 বার ধীর


4
public class FindDigitFromString 
{

    public static void main(String[] args) 
    {
        String s="  Hi How Are You 11  ";        
        String s1=s.replaceAll("[^0-9]+", "");
        //*replacing all the value of string except digit by using "[^0-9]+" regex.*
       System.out.println(s1);          
   }
}

আউটপুট: 11



2

আমি ফোন নম্বরগুলির জন্য কোড চূড়ান্ত করেছি +9 (987) 124124।

ইউনিকোডের অক্ষরগুলি 4 বাইট দখল করে।

public static String stripNonDigitsV2( CharSequence input ) {
    if (input == null)
        return null;
    if ( input.length() == 0 )
        return "";

    char[] result = new char[input.length()];
    int cursor = 0;
    CharBuffer buffer = CharBuffer.wrap( input );
    int i=0;
    while ( i< buffer.length()  ) { //buffer.hasRemaining()
        char chr = buffer.get(i);
        if (chr=='u'){
            i=i+5;
            chr=buffer.get(i);
        }

        if ( chr > 39 && chr < 58 )
            result[cursor++] = chr;
        i=i+1;
    }

    return new String( result, 0, cursor );
}


0
import java.util.*;
public class FindDigits{

 public static void main(String []args){
    FindDigits h=new  FindDigits();
    h.checkStringIsNumerical();
 }

 void checkStringIsNumerical(){
    String h="hello 123 for the rest of the 98475wt355";
     for(int i=0;i<h.length();i++)  {
      if(h.charAt(i)!=' '){
       System.out.println("Is this '"+h.charAt(i)+"' is a digit?:"+Character.isDigit(h.charAt(i)));
       }
    }
 }

void checkStringIsNumerical2(){
    String h="hello 123 for 2the rest of the 98475wt355";
     for(int i=0;i<h.length();i++)  {
         char chr=h.charAt(i);
      if(chr!=' '){
       if(Character.isDigit(chr)){
          System.out.print(chr) ;
       }
       }
    }
 }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.