簡體   English   中英

Java String - 查看字符串是否只包含數字而不包含字母

[英]Java String - See if a string contains only numbers and not letters

我在整個應用程序中加載了一個字符串,它從數字變為字母等。 我有一個簡單的if語句來查看它是否包含字母或數字,但是有些地方不太正常。 這是一個片段。

String text = "abc"; 
String number; 

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

盡管text變量確實包含字母,但條件返回為true &&應該評估,因為兩個條件都必須為true才能處理number = text;

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

解決方案:

我能夠通過使用這個問題的評論提供的以下代碼來解決這個問題。 所有其他帖子也有效!

我使用的有效方法來自第一條評論。 盡管提供的所有示例代碼似乎也有效!

String text = "abc"; 
String number; 

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

如果您要將數字作為文本處理,請更改:

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

到:

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

而不是檢查該字符串包含字母字符,檢查,以確保它僅僅包含數字。

如果您確實想使用數值,請使用Integer.parseInt()Double.parseDouble()正如其他人在下面解釋的那樣。


作為旁注,將布爾值與truefalse進行比較通常被認為是不好的做法。 只需使用if (condition)if (!condition)

您還可以使用 Apache Commons 中的NumberUtil.isCreatable(String str)

這就是我將如何做到的:

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

$將避免部分匹配,例如; 1B

性能方面的parseInt等比其他解決方案差得多,因為至少需要異常處理。

我運行了 jmh 測試,發現使用charAt迭代 String 並將字符與邊界字符進行比較是測試字符串是否僅包含數字的最快方法。

JMH測試

測試比較Character.isDigitPattern.matcher().matchesLong.parseLong與檢查字符值的性能。

這些方法可以為非 ascii 字符串和包含 +/- 符號的字符串產生不同的結果。

測試在吞吐量模式下運行(越大越好),有 5 次預熱迭代和 5 次測試迭代。

結果

請注意,對於第一次測試加載, parseLong幾乎比isDigit慢 100 倍。

## 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 日更新

  • 添加另外兩種情況 - 一種使用charAt而不是創建額外的數組,另一種使用字符代碼的IntStream
  • 如果為循環測試用例找到非數字,則添加立即中斷
  • 對於循環測試用例,為空字符串返回 false

2018 年 2 月 23 日更新

  • 再添加一個測試用例(最快的!),在不使用流的情況下比較 char 值

為了簡單地檢查它只包含 ALPHABETS 的字符串,請使用以下代碼:

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

為了簡單地檢查它只包含 NUMBER 的字符串,請使用以下代碼:

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

希望這會對某人有所幫助!

Apache Commons Lang提供org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs) ,它將String作為參數並檢查它是否由純數字字符組成(包括來自非拉丁文字的數字)。 如果有空格、減號、加號等字符和逗號和點等小數點分隔符,則該方法返回false

該類的其他方法允許進一步的數字檢查。

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

下面的正則表達式可用於檢查字符串是否只有數字:

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

如果 String 包含非數字,則上述兩個條件都將返回true false ,字符串只有數字。

您可以使用 Regex.Match

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

或者你可以使用像Integer.parseInt(String)或更好的Long.parseLong(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
}

在 Java 中有很多工具可以從String獲取數字(反之亦然)。 您可能想跳過正則表達式部分,以免自己陷入復雜的境地。

例如,您可以嘗試查看Double.parseDouble(String s)為您返回的內容。 如果在字符串中沒有找到合適的值,它應該拋出一個NumberFormatException 我建議使用這種技術,因為您實際上可以將String表示的值用作數字類型。

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;
    }
}

這是我的代碼,希望對您有所幫助!

 public boolean isDigitOnly(String text){

    boolean isDigit = false;

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

    return isDigit;
}
StringUtils.isNumeric("1234")

這很好用。

這段代碼已經寫好了。 如果你不介意(非常)輕微的性能損失——這可能不比做正則表達式匹配更糟糕——使用Integer.parseInt()Double.parseDouble() 如果 String 只是數字(或者數字,視情況而定),它會立即告訴您。 如果您需要處理更長的數字字符串, BigIntegerBigDecimal都支持接受字符串的構造函數。 如果您嘗試將非數字(整數或小數,當然取決於您選擇的數字)傳遞給它,其中任何一個都會拋出NumberFormatException 異常 或者,根據您的要求,只需迭代 String 中的字符並檢查Character.isDigit()和/或Character.isLetter()

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

                }
                else if (Character.isLetter())
                {

                }

工作測試示例

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());
                }
            }

檢查 no 是否為字符串的方法

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

在這種典型場景中包含任何異常拋出/處理是一種不好的做法。

因此 parseInt() 不是很好,但正則表達式是一個優雅的解決方案,但請注意以下事項:
-分數
-負數
-decimal 分隔符可能因contries 不同(例如',' 或'.')
- 有時允許使用所謂的千位分隔符,例如空格或逗號,例如 12,324,1000.355

要處理應用程序中的所有必要情況,您必須小心,但此正則表達式涵蓋了典型情況(正/負和小數,用點分隔): ^[-+]?\\d*.?\\d+$
對於測試,我推薦regexr.com

Adam Bodrogi 的略微修改版:

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;
}
}

今天不得不使用它,所以只發布了我的修改。 包括貨幣、千位逗號或句點符號以及一些驗證。 不包括其他貨幣符號(歐元、美分),驗證逗號為每三位數字。

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");
    }
}

}

這是一個示例。 根據需要僅查找 String 和 Process 格式中的數字。

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

有關更多信息,請查看谷歌文檔https://developer.android.com/reference/java/util/regex/Pattern在哪里可以使用Pattern

使用 Java 8 流和 lambda 的解決方案

String data = "12345";
boolean isOnlyNumbers = data.chars().allMatch(Character::isDigit);
boolean flag = false;
        System.out.print("Enter String : ");
        String str = new Scanner(System.in).next();

        for (int i = 0; i < str.length(); i++)
        {
            if (str.length() <= 0)
            {
                System.out.println("String length Can't be zero.");
                return;
            }
            char ch = str.charAt(i);
            int c = ch;
            if (c >= 48 && c <= 58)
            {
                flag = true;
            } else
            {
                flag = false;
                break;
            }
        }
        if (flag)
        {
            System.out.println("input [" + str + "] contains number only.");
        } else
            System.out.println("input [" + str + "] have some non string values in it.");

您也可以使用[a-zA-Z]{2,}

其中[a-zA-Z]僅檢查字母, {2,}檢查長度,應大於 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM