235

アプリケーション全体にロードする文字列があり、それは数字から文字などに変わります。文字や数字が含まれているかどうかを確認する簡単なifステートメントがありますが、何かが正しく機能していません。これがスニペットです。

String text = "abc"; 
String number; 

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

text変数には文字が含まれていますが、条件はとして返されますtrue。およびは、を処理するために&&両方の条件が必要であるため、評価する必要がありますtruenumber = text;

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

解決:

この質問へのコメントによって提供された次のコードを使用することで、これを解決することができました。他のすべての投稿も有効です!

私が使ったものは最初のコメントから来ました。提供されているすべてのサンプルコードも有効なようですが!

String text = "abc"; 
String number; 

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

21 に答える 21

401

番号をテキストとして処理する場合は、次を変更します。

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

に:

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

文字列に英字が含まれていないことを確認する代わりに、数字のみが含まれていることを確認してください。

実際に数値を使用したい場合は、Integer.parseInt()またはDouble.parseDouble()他の人が以下で説明しているように使用してください。


true補足として、ブール値をまたはと比較することは一般的に悪い習慣と考えられていますfalseif (condition)またはを使用するだけif (!condition)です。

于 2012-05-13T22:14:20.360 に答える
21

Apache CommonsのNumberUtil.isCreatable(String str)を使用することもできます

于 2015-01-23T10:03:47.030 に答える
18

これは私がそれをする方法です:

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

$部分的な一致を回避します。1B

于 2016-09-16T12:05:54.310 に答える
13

文字列にアルファベットのみが含まれていることを簡単に確認するには、次のコードを使用します。

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

文字列にNUMBERのみが含まれていることを簡単に確認するには、次のコードを使用します。

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

これが誰かに役立つことを願っています!

于 2018-05-01T08:36:45.873 に答える
12

parseInt少なくとも例外処理が必要なため、パフォーマンス面などは他のソリューションよりもはるかに劣ります。

jmhテストを実行しましたが、文字列を使用して文字列を反復処理し、文字列charAtと境界文字を比較することが、文字列に数字のみが含まれているかどうかをテストする最も速い方法であることがわかりました。

JMHテスト

テストでは、char値のチェックとCharacter.isDigitvsのパフォーマンスを比較します。Pattern.matcher().matchesLong.parseLong

これらの方法では、ASCII以外の文字列と+/-記号を含む文字列で異なる結果が生成される可能性があります。

テストは、5回のウォームアップ反復と5回のテスト反復でスループットモード(大きいほど良い)で実行されます。

結果

これは、最初のテストロードの場合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;
                    }
                }
            }
        }
    }
}

2018年2月23日に更新

  • さらに2つのケースを追加します。1つcharAtは追加の配列を作成する代わりに使用し、もう1つIntStreamは文字コードを使用します。
  • ループしたテストケースで数字以外が見つかった場合は、即時ブレークを追加します
  • ループされたテストケースの空の文字列に対してfalseを返します

2018年2月23日に更新

  • ストリームを使用せずにchar値を比較するテストケースをもう1つ追加します(最速です!)
于 2018-02-20T10:26:49.900 に答える
7

Apache Commons Langorg.apache.commons.lang.StringUtils.isNumeric(CharSequence cs)、を引数として取り、それStringが純粋な数字(非ラテン文字からの数字を含む)で構成されているかどうかをチェックするを提供します。このメソッドはfalse、スペース、マイナス、プラスなどの文字、およびコンマやドットなどの小数点がある場合に返されます。

そのクラスの他のメソッドでは、さらに数値をチェックできます。

于 2018-02-01T12:42:41.087 に答える
4

boolean isNum = text.chars()。allMatch(c-> c> = 48 && c <= 57)

于 2017-01-27T22:33:56.190 に答える
4

以下のregexを使用して、文字列に数字のみがあるかどうかを確認できます。

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

true文字列に数値以外が含まれている場合、上記の両方の条件が返されます。で、文字false列には数字のみが含まれます。

于 2017-04-16T23:51:32.600 に答える
3

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
}
于 2016-09-16T09:53:25.297 に答える
2

Javaのsから数値を取得する機能はたくさんありStringます(その逆も同様です)。その複雑さを回避するために、正規表現の部分をスキップすることをお勧めします。

たとえば、何Double.parseDouble(String s)が戻ってくるかを試してみることができます。NumberFormatException文字列に適切な値が見つからない場合は、をスローする必要があります。で表される値をString数値型として実際に利用できるので、この手法をお勧めします。

于 2012-05-13T22:13:37.113 に答える
2
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;
    }
}
于 2016-12-01T08:03:48.773 に答える
2

これが私のコードです。これがお役に立てば幸いです。

 public boolean isDigitOnly(String text){

    boolean isDigit = false;

    if (text.matches("[0-9]+") && text.length() > 2) {
        isDigit = true;
    }else {
        isDigit = false;
    }

    return isDigit;
}
于 2018-09-27T11:56:42.677 に答える
2

Java8ストリームとラムダを使用したソリューション

String data = "12345";
boolean isOnlyNumbers = data.chars().allMatch(Character::isDigit);
于 2021-12-24T14:07:11.963 に答える
1

これがサンプルです。必要に応じて、文字列とプロセスフォーメーションの数字のみを検索します。

text.replaceAll("\\d(?!$)", "$0 ");

詳細については、Googleドキュメントを確認して くださいhttps://developer.android.com/reference/java/util/regex/Patternパターンを使用できる場所

于 2021-01-22T19:24:53.337 に答える
1
StringUtils.isNumeric("1234")

これは正常に機能します。

于 2022-02-15T05:16:22.993 に答える
0

このコードはすでに書かれています。(非常に)マイナーなパフォーマンスの低下を気にしない場合(おそらく正規表現の一致を実行するよりも悪くはありません)、 Integer.parseInt()またはDouble.parseDouble()を使用してください。文字列が数字のみ(または必要に応じて数字)であるかどうかがすぐにわかります。より長い数値の文字列を処理する必要がある場合は、文字列を受け入れるBigIntegerBigDecimalの両方のスポーツコンストラクター。これらのいずれも、数値以外(もちろん、選択したものに基づいて、整数または10進数)を渡そうとすると、 NumberFormatExceptionをスローします。または、要件に応じて、文字列内の文字を繰り返し、Character.isDigit()を確認します。および/またはCharacter.isLetter()

于 2012-05-13T22:15:28.520 に答える
0
Character first_letter_or_number = query.charAt(0);
                //------------------------------------------------------------------------------
                if (Character.isDigit())
                {

                }
                else if (Character.isLetter())
                {

                }
于 2017-12-29T01:07:51.357 に答える
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();
    }
于 2018-05-17T20:58:46.330 に答える
0

このような典型的なシナリオに例外のスロー/処理を含めることは悪い習慣です。

したがって、parseInt()は適切ではありませんが、正規表現はこのための洗練されたソリューションですが、次の

に注意して ください

スペースやコンマなど、いわゆる千の区切り文字を使用できます(例:12,324,1000.355)。

アプリケーションで必要なすべてのケースを処理するには注意が必要ですが、この正規表現は一般的なシナリオ(正/負および分数、ドットで区切られています)をカバーしています。^ [-+]?\ d *。?\ d + $
Forテスト、regexr.comをお勧めします。

于 2018-09-02T20:05:25.133 に答える
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;
}
}

今日これを使用しなければならなかったので、ちょうど私の変更を投稿しました。通貨、数千のコンマまたはピリオド表記、およびいくつかの検証が含まれます。他の通貨表記(ユーロ、セント)は含まれず、検証コンマは3桁ごとです。

于 2020-01-21T15:53:24.993 に答える
0
public class Test{  
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str;
    boolean status=false;
    System.out.println("Enter the String : ");
    str = sc.nextLine();
    
    char ch[] = str.toCharArray();
    
    for(int i=0;i<ch.length;i++) {
        if(ch[i]=='1'||ch[i]=='2'||ch[i]=='3'||ch[i]=='4'||ch[i]=='5'||ch[i]=='6'||ch[i]=='7'||ch[i]=='8'||ch[i]=='9'||ch[i]=='0') {
            ch[i] = 0;
        }
    }
    
    for(int i=0;i<ch.length;i++) {
        if(ch[i] != 0) {
            System.out.println("Mixture of letters and Digits");
            status = false;
            break;
        }
        else
            status = true;
    }
    
    if(status == true){
        System.out.println("Only Digits are present");
    }
}

}

于 2020-10-06T06:22:41.220 に答える