জাভা স্ট্রিং - দেখুন কোনও স্ট্রিংয়ে অক্ষর নেই কেবল সংখ্যা রয়েছে


196

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

String text = "abc"; 
String number; 

if (text.contains("[a-zA-Z]+") == false && text.length() > 2) {
    number = text; 
}

যদিও textচলকটিতে অক্ষর থাকে না তবে শর্তটি ফিরে আসে true। এবং &&উভয় অবস্থার হতে তার হিসাবে Eval উচিত trueঅর্ডার প্রক্রিয়া করার জন্যnumber = text;

==============================

সমাধান:

এই প্রশ্নের একটি মন্তব্য দ্বারা প্রদত্ত নিম্নলিখিত কোডটি ব্যবহার করে আমি এটি সমাধান করতে সক্ষম হয়েছি। অন্যান্য সমস্ত পোস্টও বৈধ!

আমি যে কাজ করেছি তা প্রথম মন্তব্য থেকে এসেছে। যদিও দেওয়া সমস্ত উদাহরণ কোডগুলিও বৈধ বলে মনে হচ্ছে!

String text = "abc"; 
String number; 

if (Pattern.matches("[a-zA-Z]+", text) == false && text.length() > 2) {
    number = text; 
}

5
ইনপুট হিসাবে একটি regexp গ্রহণ করে না। হয় ব্যবহার করুন matches("\\d{2,}")বা একটি PatternএবংMatcher
গিলাইম পোলেট

স্ট্রিংয়ের দশমিক মান বা কেবল পূর্ণসংখ্যার মান থাকতে পারে?
সিউডোরাম

3
আপনি কেন পাঠ্য দৈর্ঘ্য ()> 2 পরীক্ষা করছেন? কি কারণ?
কোড উত্সাহী

1
@ রেডহ্যাটসিকে Pattern.matches("[a-zA-Z]+", text) == falseসরল করা যায়!Pattern.matches("[a-zA-Z]+", text)
সারোস

2
জাভা স্ট্রিমিং এপিআই boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));ফর্ম Max Malyshপোস্ট ব্যবহার করে ।
যশ

উত্তর:


354

আপনি যদি পাঠ্য হিসাবে নম্বরটি প্রসেস করেন তবে পরিবর্তন করুন:

if (text.contains("[a-zA-Z]+") == false && text.length() > 2){

প্রতি:

if (text.matches("[0-9]+") && text.length() > 2) {

পরিবর্তে টিক চিহ্ন দেওয়ার যে স্ট্রিং এর নেই বর্ণানুক্রমিক অক্ষর হতে পরীক্ষা নিশ্চিত এটা রয়েছে শুধুমাত্র numerics।

আপনি আসলে সাংখ্যিক মান, ব্যবহার ব্যবহার করতে চান তাহলে Integer.parseInt()বা Double.parseDouble()অন্যদের নিচে বর্ননা করেছি।


পার্শ্ব নোট হিসাবে, এটি সাধারণত বুলিয়ান মানগুলি trueবা এর সাথে তুলনা করা খারাপ অভ্যাস হিসাবে বিবেচিত হয় false। শুধু ব্যবহার if (condition)বা if (!condition)


25
আপনি সম্ভবত অ্যাঙ্কর যুক্ত করতে চান (উদাহরণস্বরূপ ^[0-9]+$) অন্যথায় abc123defএকটি সংখ্যা হিসাবে বিবেচিত হবে।
আইসিআর

10
আমি মনে করি না যে এটি প্রয়োজনীয়। matches()যদি এটি শুরু থেকে শেষ পর্যন্ত সম্পূর্ণ ম্যাচ হয় তবেই সত্যটি প্রত্যাবর্তিত হয়।
Chthonic প্রকল্প

4
"^ -? \ d + \।? \ d * $" পুরো স্ট্রিংটির সাথে তুলনা করবে এবং কেবলমাত্র এটি বৈধ সংখ্যা হলে (নেগেটিভ এবং দশমিক অন্তর্ভুক্ত) মিলবে। উদাহরণস্বরূপ, এটি 1, 10, 1.0, -1, -1.0 ইত্যাদির সাথে মিলবে এটি "1." এও মিলবে " তবে এটি প্রায়শই যেভাবেই পার্স করা যায়।

16
কল করার দরকার নেই && (text.length() > 2)if (text.matches("[0-9]{3,}")
রিজেক্স

পূর্ণসংখ্যা নয় এমন সংখ্যার জন্য কমা বা বিন্দু সম্পর্কে কী বলা যায়?
নিব্বানা

20

আপনি অ্যাপাচি কমন্স থেকে নাম ইউটিল.আইসক্রিটেবল (স্ট্রিং স্ট্র্যাম) ব্যবহার করতে পারেন


4
আমি মনে করি না যে NumberUtil.isCreatable(String str)মূল প্রশ্নটি যা জিজ্ঞাসা করে তার জন্য ব্যবহার করা সঠিক। উদাহরণস্বরূপ, NumberUtil.isCreatable( "09" )রিটার্ন false, যদিও "09" শুধুমাত্র সংখ্যা রয়েছে
আব্দুল

14

আমি এটি এইভাবে করব:

if(text.matches("^[0-9]*$") && text.length() > 2){
    //...
}

$একটি আংশিক ম্যাচ যেমন এড়াতে হবে; 1B


1
আমার দরকার নেই text.length() > 2, অংশ তাই আমি ঠিক প্রতিস্থাপিত ^[0-9]*$দ্বারা ^[0-9]+$নিশ্চিত আমি অন্তত একটি নম্বর আছে যাবে।
YB কারণ

8

পারফরম্যান্স-ভিত্তিক parseIntএবং এগুলি অন্যান্য সমাধানগুলির চেয়ে আরও খারাপ, কারণ কমপক্ষে ব্যতিক্রম হ্যান্ডলিংয়ের প্রয়োজন।

আমি জেএমএইচ টেস্ট চালিয়েছি এবং দেখেছি charAtস্ট্রিংয়ের উপরে পুনরাবৃত্তি হ'ল স্ট্রিংয়ের মধ্যে কেবলমাত্র সংখ্যা রয়েছে কিনা তা পরীক্ষা করার দ্রুততম উপায় ary

জেএমএইচ টেস্টিং

পরীক্ষাগুলি Character.isDigitবনাম Pattern.matcher().matchesবনাম Long.parseLongবনাম পরীক্ষার চরিত্রের মানগুলির তুলনা করে ।

এই উপায়গুলি অ-এসিআই স্ট্রিং এবং স্ট্রিংগুলিতে +/- চিহ্নগুলি সহ বিভিন্ন ফলাফল তৈরি করতে পারে।

5 টি ওয়ার্মআপ পুনরাবৃত্তি এবং 5 টি পরীক্ষা পুনরাবৃত্তি সহ টেস্টগুলি থ্রুপুট মোডে ( আরও ভাল better

ফলাফল

মনে রাখবেন যে প্রথম পরীক্ষার লোডের parseLongচেয়ে প্রায় 100 গুণ ধীর isDigit

## Test load with 25% valid strings (75% strings contain non-digit symbols)

Benchmark       Mode  Cnt  Score   Error  Units
testIsDigit    thrpt    5  9.275 ± 2.348  ops/s
testPattern    thrpt    5  2.135 ± 0.697  ops/s
testParseLong  thrpt    5  0.166 ± 0.021  ops/s

## Test load with 50% valid strings (50% strings contain non-digit symbols)

Benchmark              Mode  Cnt  Score   Error  Units
testCharBetween       thrpt    5  16.773 ± 0.401  ops/s
testCharAtIsDigit     thrpt    5  8.917 ± 0.767  ops/s
testCharArrayIsDigit  thrpt    5  6.553 ± 0.425  ops/s
testPattern           thrpt    5  1.287 ± 0.057  ops/s
testIntStreamCodes    thrpt    5  0.966 ± 0.051  ops/s
testParseLong         thrpt    5  0.174 ± 0.013  ops/s
testParseInt          thrpt    5  0.078 ± 0.001  ops/s

পরীক্ষা স্যুট

@State(Scope.Benchmark)
public class StringIsNumberBenchmark {
    private static final long CYCLES = 1_000_000L;
    private static final String[] STRINGS = {"12345678901","98765432177","58745896328","35741596328", "123456789a1", "1a345678901", "1234567890 "};
    private static final Pattern PATTERN = Pattern.compile("\\d+");

    @Benchmark
    public void testPattern() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                b = PATTERN.matcher(s).matches();
            }
        }
    }

    @Benchmark
    public void testParseLong() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                try {
                    Long.parseLong(s);
                    b = true;
                } catch (NumberFormatException e) {
                    // no-op
                }
            }
        }
    }

    @Benchmark
    public void testCharArrayIsDigit() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                for (char c : s.toCharArray()) {
                    b = Character.isDigit(c);
                    if (!b) {
                        break;
                    }
                }
            }
        }
    }

    @Benchmark
    public void testCharAtIsDigit() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                for (int j = 0; j < s.length(); j++) {
                    b = Character.isDigit(s.charAt(j));
                    if (!b) {
                        break;
                    }
                }
            }
        }
    }

    @Benchmark
    public void testIntStreamCodes() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                b = s.chars().allMatch(c -> c > 47 && c < 58);
            }
        }
    }

    @Benchmark
    public void testCharBetween() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                for (int j = 0; j < s.length(); j++) {
                    char charr = s.charAt(j);
                    b = '0' <= charr && charr <= '9';
                    if (!b) {
                        break;
                    }
                }
            }
        }
    }
}

23 ফেব্রুয়ারী, 2018 আপডেট হয়েছে

  • আরও দুটি কেস যুক্ত করুন - একটি charAtঅতিরিক্ত অ্যারে তৈরির পরিবর্তে এবং অন্যটি IntStreamচর কোড ব্যবহার করে
  • লুপযুক্ত পরীক্ষার ক্ষেত্রে অ-অঙ্ক পাওয়া গেলে অবিলম্বে বিরতি যুক্ত করুন
  • লুপযুক্ত পরীক্ষার ক্ষেত্রে খালি স্ট্রিংয়ের জন্য মিথ্যা ফিরিয়ে দিন

23 ফেব্রুয়ারী, 2018 আপডেট হয়েছে

  • আরও একটি পরীক্ষার কেস যুক্ত করুন (দ্রুত!) যা স্ট্রিমটি ব্যবহার না করে চরের মানের সাথে তুলনা করে

1
আপনি যদি চ্যারিআর কোডের দিকে লক্ষ্য করেন তবে এটি একটি চর অ্যারে বরাদ্দ করছে এবং চরগুলি অনুলিপি করছে (আমি মনে করি এটি ব্যয়বহুল হতে পারে)। আপনি যদি কেবল একটি সূচক এবং চরআউট ব্যবহার করে স্ট্রিংটি পুনরাবৃত্তি করেন তবে এটি কী দ্রুত হবে? আপনি যদি অ্যান্ডি থেকে আপনার পরীক্ষাগুলিতে সমাধান যোগ করতে পারেন তবে তা আকর্ষণীয়ও হবে: বুলিয়ান isNum = Text.chars ()। AllMatch (c -> c> = 48 && c <= 57)
Aldo Canepa

8

কেবলমাত্র ALPHABETS রয়েছে সেই স্ট্রিংটি পরীক্ষা করার জন্য নিম্নলিখিত কোডটি ব্যবহার করুন:

if (text.matches("[a-zA-Z]+"){
   // your operations
}

কেবলমাত্র এই স্ট্রিংটি পরীক্ষা করতে কেবল এটিতে অন্তর্ভুক্ত রয়েছে NUMBER টি নিম্নলিখিত কোডটি ব্যবহার করুন:

if (text.matches("[0-9]+"){
   // your operations
}

আশা করি এটি কারও সাহায্য করবে!


3

বুলিয়ান isNum = Text.chars ()। allMatch (c -> c> = 48 && c <= 57)


1
যাদু সংখ্যা হ্রাস করতে, আপনি নিম্নলিখিত হিসাবে তুলনা করতে পারেন:boolean isNum = text.chars().allMatch(c -> c >= '0' && c <= '9')
Phe0nix

2

আপনি Regex.Match ব্যবহার করতে পারেন

if(text.matches("\\d*")&& text.length() > 2){
    System.out.println("number");
}

অথবা আপনি উদাহরণস্বরূপ বড় সংখ্যার জন্য পছন্দ Integer.parseInt(String)বা আরও ভাল ব্যবহার করতে পারেন Long.parseLong(String):

private boolean onlyContainsNumbers(String text) {
    try {
        Long.parseLong(text);
        return true;
    } catch (NumberFormatException ex) {
        return false;
    }
} 

এবং তারপরে পরীক্ষা করুন:

if (onlyContainsNumbers(text) && text.length() > 2) {
    // do Stuff
}

.মেলা ("^ \\ d + $")
CrandellWS

2

স্ট্রিংয়ের কেবলমাত্র নম্বর আছে কি না তা পরীক্ষা করতে নীচে রেজেক্সগুলি ব্যবহার করা যেতে পারে:

if (str.matches(".*[^0-9].*")) or if (str.matches(".*\\D.*"))

উপরের দুটি শর্ত trueযদি স্ট্রিংটিতে অ-সংখ্যা থাকে তবে ফিরে আসবে । চালু false, স্ট্রিংয়ের কেবল সংখ্যা রয়েছে।


2

অ্যাপাচি কমন্স ল্যাং সরবরাহ করে org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs), এটি একটি আর্গুমেন্ট হিসাবে গ্রহণ করে Stringএবং এটি খাঁটি সংখ্যাসূচক অক্ষর (নন-ল্যাটিন স্ক্রিপ্টগুলির সংখ্যা সহ) অন্তর্ভুক্ত করে কিনা তা পরীক্ষা করে। সেই পদ্ধতিটি ফিরে আসেfalseস্থান, বিয়োগ, প্লাস এবং দশমিক বিভাজক যেমন কমা এবং বিন্দুর মতো অক্ষর থাকলে ।

এই শ্রেণীর অন্যান্য পদ্ধতি আরও সংখ্যার চেকের অনুমতি দেয়।


1
এটি একটি রেজেক্সের চেয়ে অনেক দ্রুত হওয়া উচিত; এখানে বাস্তবায়নটি এখানে রয়েছে: public static boolean isNumeric(String str) { if (str == null) { return false; } else { int sz = str.length(); for(int i = 0; i < sz; ++i) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } }
লিও

1

নম্বর পেতে প্রচুর সুযোগ-সুবিধা রয়েছে Stringজাভাতে (এবং বিপরীতে) । নিজেকে এর জটিলতা থেকে বাঁচাতে আপনি রেজেক্স অংশটি এড়িয়ে যেতে চাইতে পারেন।

উদাহরণস্বরূপ, আপনি চেষ্টা করতে পারেন এবং দেখতে পান যে Double.parseDouble(String s)আপনাকে কী দেয়। এটি NumberFormatExceptionস্ট্রিংয়ে একটি উপযুক্ত মান না খুঁজে পেলে এটি ফেলে দেওয়া উচিত । আমি এই কৌশলটি পরামর্শ দেব কারণ আপনি Stringসংখ্যার প্রকার হিসাবে প্রতিনিধিত্ব করে এমন মানটি ব্যবহার করতে পারবেন ।


5
আপনার ইনপুটটি পরীক্ষা করার জন্য কেন একটি ব্যতিক্রম ব্যবহার করা খারাপ ধারণা হতে পারে, ব্যতিক্রমগুলি একটি বড় ওভারহেড তৈরি করে।
অফির লুজন

1
@ ওফিরলুজান আমি সম্মত হই যে ব্যতিক্রমগুলি উত্থাপিত হতে চলেছে এমন প্রত্যাশিত কেসগুলি পরিচালনা করার দুর্দান্ত উপায় নয়। তবে আমি মনে করি যে আরও প্রসঙ্গ ছাড়াই পারফরম্যান্স হিট হবে কিনা তা বলা মুশকিল।
সিউডোরাম্বল


0

এই কোডটি ইতিমধ্যে লেখা আছে। আপনি যদি (অত্যন্ত) গৌণ পারফরম্যান্স হিটটিকে আপত্তি না জানায় - যা সম্ভবত কোনও রেজেক্স ম্যাচ করার চেয়ে খারাপ নয় - Integer.parseInt () বা Double.parseDouble () ব্যবহার করুন । স্ট্রিং কেবলমাত্র সংখ্যা হলে (বা উপযুক্ত হিসাবে একটি সংখ্যা) তবে এটি এখনই আপনাকে জানাব । আপনার যদি সংখ্যার দীর্ঘতর স্ট্রিংগুলি পরিচালনা করতে হয় তবে বিগইন্টিজার এবং বিগডিসিমাল উভয় ক্রীড়া নির্মাতা যারা স্ট্রিং গ্রহণ করে। এগুলির যে কোনও একটি নম্বরের ফর্ম্যাট এক্সেপশন লেটার নিক্ষেপ করবে যদি আপনি এটিকে একটি নন-নম্বর (অবশ্যই অবিচ্ছেদ্য বা দশমিক, আপনি যা পছন্দ করেন তার উপর ভিত্তি করে) পাস করার চেষ্টা করেন। পর্যায়ক্রমে, আপনার প্রয়োজনীয়তার উপর নির্ভর করে কেবল স্ট্রিংয়ের অক্ষরগুলিকে পুনরাবৃত্তি করুন এবং চরিত্রটি পরীক্ষা করুন isডিজিট ()এবং / অথবা চরিত্র.আইসলেটার ()


0
import java.util.*;

class Class1 {
    public static void main(String[] argh) {
        boolean ans = CheckNumbers("123");
        if (ans == true) {
            System.out.println("String contains numbers only");
        } else {
            System.out.println("String contains other values as well");

        }
    }


    public static boolean CheckNumbers(String input) {
        for (int ctr = 0; ctr < input.length(); ctr++) {
            if ("1234567890".contains(Character.valueOf(input.charAt(ctr)).toString())) {
                continue;
            } else {
                return false;
            }
        }
        return true;
    }
}

0
Character first_letter_or_number = query.charAt(0);
                //------------------------------------------------------------------------------
                if (Character.isDigit())
                {

                }
                else if (Character.isLetter())
                {

                }

0

কাজের পরীক্ষা উদাহরণ

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

public class PaserNo {

    public static void main(String args[]) {

        String text = "gg";

        if (!StringUtils.isBlank(text)) {
            if (stringContainsNumber(text)) {
                int no=Integer.parseInt(text.trim());
                System.out.println("inside"+no);

            } else {
                System.out.println("Outside");
            }
        }
        System.out.println("Done");
    }

    public static boolean stringContainsNumber(String s) {
        Pattern p = Pattern.compile("[0-9]");
        Matcher m = p.matcher(s);
        return m.find();
    }
}

তবুও আপনার কোড "1a" ইত্যাদি দ্বারা ভেঙে যেতে পারে তাই আপনার ব্যতিক্রম চেক করা দরকার

if (!StringUtils.isBlank(studentNbr)) {
                try{
                    if (isStringContainsNumber(studentNbr)){
                    _account.setStudentNbr(Integer.parseInt(studentNbr.trim()));
                }
                }catch(Exception e){
                    e.printStackTrace();
                    logger.info("Exception during parse studentNbr"+e.getMessage());
                }
            }

না পরীক্ষা করার পদ্ধতিটি স্ট্রিং বা না

private boolean isStringContainsNumber(String s) {
        Pattern p = Pattern.compile("[0-9]");
        Matcher m = p.matcher(s);
        return m.find();
    }

0

এ জাতীয় সাধারণ দৃশ্যে কোনও ব্যতিক্রম নিক্ষেপ / পরিচালনা করা জড়িত হওয়া একটি খারাপ অভ্যাস।

সুতরাং একটি পার্সিয়ান্ট () ভাল না, তবে একটি
রেইজেক্স
এটির জন্য একটি মার্জিত সমাধান, তবে নিম্নলিখিতগুলির যত্ন নিন: -ফ্র্যাশনস- সংখ্যাসূচক সংখ্যা -
নির্দিষ্ট বিভাজক কনট্রেসে পৃথক হতে পারে (যেমন ',' বা '।')
-সময়ের সময় এটিতে স্থান বা কমা হিসাবে একটি তথাকথিত হাজার বিভাজক থাকার অনুমতি রয়েছে 12,324,1000.355

আপনার অ্যাপ্লিকেশনটিতে সমস্ত প্রয়োজনীয় কেসগুলি পরিচালনা করার জন্য আপনাকে সতর্কতা অবলম্বন করতে হবে, তবে এই রেজেক্সটি সাধারণ পরিস্থিতিতে (ধনাত্মক / নেতিবাচক এবং ভগ্নাংশ, একটি বিন্দুর দ্বারা পৃথক) কভার করে: ^ [- +]? \ D *।? \ D + $
জন্য পরীক্ষা, আমি regexr.com সুপারিশ ।


0

অ্যাডাম বোড্রোগির সামান্য পরিবর্তিত সংস্করণ:

public class NumericStr {


public static void main(String[] args) {
    System.out.println("Matches: "+NumericStr.isNumeric("20"));         // Should be true
    System.out.println("Matches: "+NumericStr.isNumeric("20,00"));          // Should be true
    System.out.println("Matches: "+NumericStr.isNumeric("30.01"));          // Should be true
    System.out.println("Matches: "+NumericStr.isNumeric("30,000.01"));          // Should be true
    System.out.println("Matches: "+NumericStr.isNumeric("-2980"));          // Should be true
    System.out.println("Matches: "+NumericStr.isNumeric("$20"));            // Should be true
    System.out.println("Matches: "+NumericStr.isNumeric("jdl"));            // Should be false
    System.out.println("Matches: "+NumericStr.isNumeric("2lk0"));           // Should be false
}

public static boolean isNumeric(String stringVal) {
    if (stringVal.matches("^[\\$]?[-+]?[\\d\\.,]*[\\.,]?\\d+$")) {
        return true;
    }

    return false;
}
}

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

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