ฉันจะทราบได้อย่างไรว่าอักขระตัวแรกของสตริงเป็นตัวเลขหรือไม่


108

ใน Java มีวิธีค้นหาว่าอักขระตัวแรกของสตริงเป็นตัวเลขหรือไม่?

วิธีหนึ่งคือ

string.startsWith("1")

และทำด้านบนจนครบ 9 แต่ดูเหมือนจะไม่มีประสิทธิภาพมาก


10
ฉันจะพูดถึงวิธี regex แต่ฉันกลัวว่าถ้าฉันทำคุณจะถูกล่อลวงให้ลอง
Michael Myers

คำตอบ:


259
Character.isDigit(string.charAt(0))

โปรดทราบว่าสิ่งนี้จะอนุญาตให้มีตัวเลข Unicode ใด ๆไม่ใช่แค่ 0-9 คุณอาจต้องการ:

char c = string.charAt(0);
isDigit = (c >= '0' && c <= '9');

หรือโซลูชัน regex ที่ช้าลง:

s.substring(0, 1).matches("\\d")
// or the equivalent
s.substring(0, 1).matches("[0-9]")

อย่างไรก็ตามด้วยวิธีการเหล่านี้ก่อนอื่นคุณต้องแน่ใจว่าสตริงไม่ว่างเปล่า ถ้าเป็นcharAt(0)และsubstring(0, 1)จะโยนStringIndexOutOfBoundsException. startsWithไม่มีปัญหานี้

ในการทำให้เงื่อนไขทั้งหมดเป็นบรรทัดเดียวและหลีกเลี่ยงการตรวจสอบความยาวคุณสามารถเปลี่ยนนิพจน์ทั่วไปดังต่อไปนี้:

s.matches("\\d.*")
// or the equivalent
s.matches("[0-9].*")

หากเงื่อนไขไม่ปรากฏในการวนซ้ำอย่างแน่นหนาในโปรแกรมของคุณประสิทธิภาพเพียงเล็กน้อยสำหรับการใช้นิพจน์ทั่วไปก็ไม่น่าจะเป็นที่สังเกตเห็นได้


Re: "ก่อนอื่นคุณต้องแน่ใจว่าสตริงไม่ว่างเปล่า" - จริงและมากกว่านั้น - คุณต้องตรวจสอบให้แน่ใจว่ามันไม่เป็นโมฆะราวกับว่ามันเป็นวิธีการที่แสดงทั้งหมดจะทำให้เกิดข้อยกเว้น คุณสามารถตรวจสอบได้โดยตรง (เช่น((null!=s) && Character.isDigit(s.charAt(0)) )) หรือใช้เทคนิคเช่นCharacter.isDigit((s?s:"X").charAt(0))
epeleg

8

นิพจน์ทั่วไปเป็นเครื่องมือที่แข็งแกร่งมาก แต่มีราคาแพง สามารถใช้เพื่อตรวจสอบได้ว่าอักขระตัวแรกเป็นตัวเลขหรือไม่ แต่ไม่สวยหรูนัก :) ฉันชอบวิธีนี้:

public boolean isLeadingDigit(final String value){
    final char c = value.charAt(0);
    return (c >= '0' && c <= '9');
}

12
1) functionไม่ใช่ Java 2) อนุญาตเฉพาะตัวเลขอารบิกไม่ใช่จีนอินเดีย ฯลฯ ซึ่งอาจเป็นสิ่งที่คุณต้องการ แต่ไม่ได้ระบุไว้ในคำถาม 3) ฉันได้กล่าวถึงคำตอบที่แน่นอนนี้แล้วในคำตอบของฉันเมื่อสี่ปีก่อน
Michael Myers

0
regular expression starts with number->'^[0-9]' 
Pattern pattern = Pattern.compile('^[0-9]');
 Matcher matcher = pattern.matcher(String);

if(matcher.find()){

System.out.println("true");
}

2
คุณไม่ต้องการ{1,1}คำต่อท้ายซึ่งหมายความว่า "รูปแบบก่อนหน้าต้องปรากฏระหว่าง 1 ถึง 1 ครั้ง" ซึ่งหมายความว่าเหมือนกับรูปแบบของมันเองทุกประการ
Andrzej Doyle

โซลูชันนี้ใช้ไม่ได้เนื่องจาก String.matches และ Pattern API พยายามจับคู่สตริงที่สมบูรณ์ไม่ใช่แค่อักขระตัวแรก
Amrish Pandey

0

ฉันเพิ่งเจอคำถามนี้และคิดว่าจะมีส่วนร่วมกับโซลูชันที่ไม่ใช้นิพจน์ทั่วไป

ในกรณีของฉันฉันใช้วิธีช่วยเหลือ:

public boolean notNumber(String input){
    boolean notNumber = false;
    try {
        // must not start with a number
        @SuppressWarnings("unused")
        double checker = Double.valueOf(input.substring(0,1));
    }
    catch (Exception e) {
        notNumber = true;           
    }
    return notNumber;
}

น่าจะเป็น overkill แต่ฉันพยายามหลีกเลี่ยง regex ทุกครั้งที่ทำได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.