ජාවා හි නූල් සංඛ්‍යාත්මකදැයි පරීක්ෂා කරන්නේ කෙසේද


901

එය විග්‍රහ කිරීමට පෙර නූල් අංකයක් දැයි ඔබ පරීක්ෂා කරන්නේ කෙසේද?


36
නිතිපතා නිරාවරණයන් සමඟ යෝජනා කරන සියලුම විසඳුම් ෂඩාස්රාකාර අංක සඳහා ක්‍රියා නොකරනු ඇත.
ඔස්කාර් කැස්ටිබ්ලැන්කෝ

තරඟ වල (...) ශ්‍රිතය තුළ ශුන්‍ය නූල් පසු කිරීම NullPointer ව්‍යතිරේකය විසි කරයි.
හිටේෂ් සාහු

තෙවන පාර්ශවීය පුස්තකාල නොමැතිව සංක්ෂිප්ත ජාවා 8 විසඳුමක් සඳහා මැක්ස් මාලිෂ්ගේ පිළිතුර බලන්න.
ඇන්ඩි තෝමස්

Ites හිටේෂාහු ශුන්‍ය නූල් නවතම අනුවාදයෙන් (ජාවා 6.x සහ 7.x ඇතුළුව)
මනාව

භාවිතා Integer.parseInt()කිරීමට යෝජනා කර ඇති සියලුම විසඳුම් ජංගම දුරකථන සමඟ විග්‍රහ කිරීමට අසමත් වනු ඇත NumberFormatException.
දෝෂයක් නොවේ

Answers:


706

සමග Apache Commons Lang 3.5 සහ ඊට ඉහළ: NumberUtils.isCreatableහෝ StringUtils.isNumeric.

සමග Apache Commons Lang 3.4 සහ පහළ: NumberUtils.isNumberහෝ StringUtils.isNumeric.

හිස් නූල් සඳහා StringUtils.isNumericSpaceකුමන ප්‍රතිලාභද භාවිතා කළ හැකි trueඅතර නූලෙහි අභ්‍යන්තර අවකාශ නොසලකා හරිනු ඇත. තවත් ක්‍රමයක් නම් NumberUtils.isParsableජාවා අනුව අංකය විග්‍රහ කළ හැකිදැයි පරීක්ෂා කිරීමයි. (සම්බන්ධිත ජාවඩොක්ස් එක් එක් ක්‍රමයට සවිස්තරාත්මක උදාහරණ අඩංගු වේ.)


60
StringUtils.isNumeric()බොහෝ විට මෙහි නුසුදුසු වන්නේ එය පරික්ෂා කරන්නේ නූල් ඉලක්කම් අනුක්‍රමයක්ද යන්න පමණි. බොහෝ අඟල් සඳහා හොඳ නමුත් දශම, කණ්ඩායම් බෙදුම් යනාදිය සහිත සංඛ්‍යා සඳහා එසේ නොවේ
ජෙෆ් මර්කාඩෝ

43
ඔබට එක තැනක පේළි 3 ක ශ්‍රිතයක් අවශ්‍ය බැවින් ඔබ සම්පූර්ණ පුස්තකාලයක් ඇතුළත් නොකරන නිසා රෝදය ප්‍රතිනිර්මාණය කරන්න.
dalvarezmartinez1

12
මෙම අංගය සඳහා සම්පූර්ණ පුස්තකාලයක් එක් කිරීම ඇත්තෙන්ම වටී ද? නිසැකවම එය වෙනත් දේවල් සමඟ භාවිතා කරන්නේ නම් එය විශිෂ්ටයි, නමුත් බොහෝ විට මිනිසුන් මෙය එක් කේත පේළියකින් විසඳා ඇති බව සලකන විට එය අධික ලෙස මරණයට පත් වේ.
ජලය

7
නිෂේධනීය දේ සමඟ ක්‍රියා නොකරයි. සියලු සංඛ්‍යා වලින් අඩක් negative ණ වේ, එබැවින් .....
පෝල් ඩ්‍රැපර්

6
APaulDraper: ඔබ හරි, StringUtilsප්‍රමුඛ සං signs ා වලට සහය නොදක්වන නමුත් ඔබ පරීක්ෂා කර බැලිය යුතුයි NumberUtils.isCreatable, එය නිෂේධනයන්ට නිසි ලෙස සහාය දෙයි.
palacsint

913

මෙය සාමාන්‍යයෙන් සිදු කරනුයේ සරල පරිශීලක අර්ථ දක්වන ලද ශ්‍රිතයක් සමඟිනි (එනම් රෝල්-ඔබේම "isNumeric" ශ්‍රිතය).

වැනි දෙයක්:

public static boolean isNumeric(String str) { 
  try {  
    Double.parseDouble(str);  
    return true;
  } catch(NumberFormatException e){  
    return false;  
  }  
}

කෙසේ වෙතත්, ඔබ මෙම ශ්‍රිතයට බොහෝ දේ අමතන්නේ නම් සහ අංකයක් නොවීම නිසා බොහෝ චෙක්පත් අසාර්ථක වනු ඇතැයි ඔබ අපේක්ෂා කරන්නේ නම්, මෙම යාන්ත්‍රණයේ ක්‍රියාකාරිත්වය විශිෂ්ට නොවනු ඇත, මන්ද ඔබ එක් එක් අසාර්ථකත්වය සඳහා විසි කරනු ලබන ව්‍යතිරේකයන් මත විශ්වාසය තබන බැවින්, එය තරමක් මිල අධික මෙහෙයුමකි.

විකල්ප ප්‍රවේශයක් වනුයේ අංකයක් වලංගු භාවය පරීක්ෂා කිරීම සඳහා සාමාන්‍ය ප්‍රකාශනයක් භාවිතා කිරීමයි:

public static boolean isNumeric(String str) {
  return str.matches("-?\\d+(\\.\\d+)?");  //match a number with optional '-' and decimal.
}

ඉහත සඳහන් රෙජෙක්ස් යාන්ත්‍රණය සමඟ ප්‍රවේශම් වන්න, ඔබ අරාබි නොවන ඉලක්කම් භාවිතා කරන්නේ නම් එය අසාර්ථක වනු ඇත (එනම් 0 සිට 9 දක්වා සංඛ්‍යා). මෙයට හේතුව වන්නේ රෙජෙක්ස් හි "\ d" කොටස ගැලපෙන්නේ [0-9] පමණක් වන අතර එය ජාත්‍යන්තරව සංඛ්‍යාත්මකව නොදැන සිටීමයි. (මෙය පෙන්වා දීම ගැන ඔරිගන්ගෝස්ට ස්තූතියි!)

නැතහොත් තවත් විකල්පයක් නම්, ජාවා හි සාදන ලද java.text.NumberFormat වස්තුව භාවිතා කිරීම, නූල විග්‍රහ කිරීමෙන් පසු විග්‍රහයේ පිහිටීම නූල් අවසානයේ තිබේදැයි බැලීමටය. එය එසේ නම්, අපට සම්පූර්ණ නූල සංඛ්‍යාත්මක යැයි උපකල්පනය කළ හැකිය:

public static boolean isNumeric(String str) {
  NumberFormat formatter = NumberFormat.getInstance();
  ParsePosition pos = new ParsePosition(0);
  formatter.parse(str, pos);
  return str.length() == pos.getIndex();
}

7
Java Regex හි \ d ගැලපෙන්නේ ලතින් ඉලක්කම් වලට පමණක්ද? එය .NET regexes වැනි නම්, මෙහි විස්තර කර ඇති පරිදි ඔබ වෙනත් (උදා: අරාබි) ඉලක්කම් සමඟ ගැටලුවකට මුහුණ දෙනු ඇත: blogs.msdn.com/oldnewthing/archive/2004/03/09/86555.aspx
OregonGhost

3
අංක ෆෝමැටර් විසඳුම බොහෝ විට අංක ෆෝමැට් එක්සෙප්ෂන් එක අල්ලා ගැනීමට වඩා සුළු වශයෙන් වඩා හොඳය. හොඳම ක්‍රමය වන්නේ රීජෙක්ස් එකක් භාවිතා කිරීමයි.
චි

11
.ඔබේ රීජෙක්ස් හි ඇති දශම බෙදුම්කරු අක්‍ෂරයට පමණක් නොව ඕනෑම අක්ෂරයකට ගැලපෙන බව සලකන්න .
jqno

9
උත්සාහ කිරීමේ / අල්ලා ගැනීමේ වියදම අවබෝධ කර ගැනීම සඳහා +1. මෙය සැබවින්ම දිගු කාලීනව නැවත නැවත භාවිතා කිරීම සඳහා භාවිතා කිරීමට බිහිසුණු ප්‍රවේශයකි, නමුත් ඇත්ත වශයෙන්ම අපි ජාවාහි එය සමඟ සිරවී සිටිමු.
demongolem

5
"ලතින් ඉලක්කම්" වැනි කිසිවක් නොමැති බවත්, 0-9 ඉලක්කම් ඇත්ත වශයෙන්ම අරාබි ඉලක්කම් බවත් සලකන්න. I, II, III, IV, V, VI යනාදී ස්වරූපයෙන් ලතින් භාෂාව කතා කළ අය විසින් භාවිතා කරන ලද රෝම ඉලක්කම් සමඟ මිනිසුන් බොහෝ විට ප්‍රචලිත විය හැකිය en.wikipedia.org/wiki/Arabic_numerals ; en.wikipedia.org/wiki/Roman_numerals
dantiston

156

ඔබ ඇන්ඩ්‍රොයිඩ් හි සිටී නම්, ඔබ භාවිතා කළ යුත්තේ:

android.text.TextUtils.isDigitsOnly(CharSequence str)

ප්‍රලේඛනය මෙහි සොයාගත හැකිය

එය සරලව තබා ගන්න . බොහෝ විට සෑම කෙනෙකුටම "නැවත වැඩසටහන්" කළ හැකිය (එකම දෙය).


4
12 kape123 :) නිසැකවම "123.456" හි ඉලක්කම් අඩංගු නොවේ.
අහමඩ් ඇලෙජෝ

8
සටහන: මෙය ශුන්‍ය ආදානය සඳහා NPE හි ප්‍රති results ලයකි. එසේම, negative ණ සංඛ්‍යා හෝ දශම සමඟ ක්‍රියා නොකරයි.
gMale

2
මම එයට කැමතියි!! මම හිතන්නේ මෙය නියත වශයෙන්ම ඉලක්කම් සඳහා ය. සඳහා නොවේ .,-
illusionJJ

මෙය මා සොයන දෙයයි. 0-9 ඉලක්කම් සඳහා පමණක් පරීක්ෂා කිරීමට සරල දෙයක්. මගේ සංස්කරණ ටෙක්ස්ට් ප්‍රකාශනයේ මම පෙරනයක් සකසා ඇත, නමුත් එය වෙනස් වී හෝ පාරට බැස තිබේ නම් සරල ක්‍රමලේඛන පරීක්‍ෂණයක් කිරීම සතුටක්.
jwehrle

132

ජාවා 8 ලැම්බඩා ප්‍රකාශන.

String someString = "123123";
boolean isNumeric = someString.chars().allMatch( Character::isDigit );

4
ඔබට ක්‍රමවේද යොමු කිරීමක් ද භාවිතා කළ හැකිය: someString.chars (). AllMatch (Character :: isDigit)
Wienczny

3
හොඳයි, නමුත් තවමත් එය මෙහි සියලු "විසඳුම්" ලෙස රෝදය ප්‍රතිනිර්මාණය කරයි. එසේම, 'ශූන්‍යය' මත අසමත් වේ (අනෙක් සියල්ලම පාහේ).
qben

8
මෙම පිළිතුර සංක්ෂිප්ත, සරල හා කියවිය හැකි ය. ඔබට එය ඉංග්‍රීසි මෙන් පාහේ කියවිය හැකිය - "අක්ෂර සියල්ලම ගැලපෙන ඉලක්කම්". එයට තෙවන පාර්ශවීය පුස්තකාල අවශ්‍ය නොවේ. එය සුවිශේෂී නොවන අවස්ථාවන්හිදී ව්‍යතිරේක භාවිතා නොකරයි. මෙය පිළිගත් පිළිතුර බවට පත්විය යුතුය.
ඇන්ඩි තෝමස්

15
එය "-1" සඳහා නිපදවන්නේ කුමක්ද?
බැලස් නාමෙත්

2
නිවැරදි පිළිතුර නොවේ. සංඛ්‍යාත්මක නූලකට සංඛ්‍යාත්මක නොවන අක්ෂර තිබිය හැකිය (උදා: "." හෝ "-") සහ තවමත් පරිපූර්ණ සංඛ්‍යාත්මක විය යුතුය. උදාහරණයක් ලෙස 0.5, -1 සහ 1,000 මෙම පිළිතුර සමඟ අසමත් වන නමුත් ඒවා පරිපූර්ණ සංඛ්‍යාත්මක වේ.
සිමියොන් ජී

127

Ra ක්‍රේග්ටීපී ඔහුගේ විශිෂ් answer පිළිතුරෙහි සඳහන් කර ඇති පරිදි, නූල සංඛ්‍යාත්මකද නැද්ද යන්න පරීක්ෂා කිරීම සඳහා ව්‍යතිරේක භාවිතා කිරීම පිළිබඳව මට සමාන කාර්ය සාධනයක් ඇත. ඒ නිසා මම නූල් බෙදීමට හා භාවිතා කිරීමට අවසන් java.lang.Character.isDigit().

public static boolean isNumeric(String str)
{
    for (char c : str.toCharArray())
    {
        if (!Character.isDigit(c)) return false;
    }
    return true;
}

ජාවාඩොක්ට අනුව , Character.isDigit(char)ලතින් නොවන ඉලක්කම් නිවැරදිව හඳුනා ගනී. කාර්ය සාධනය අනුව, රීජෙක්ස් ගැලපීමකට වඩා සරල N සංඛ්‍යා සැසඳීම් සංඛ්‍යාවක් නම්, නූලෙහි අක්ෂර ගණන ගණනය කිරීමේ දී වඩා කාර්යක්ෂම වනු ඇත.

යාවත්කාලීන කිරීම: අදහස් දැක්වීමේදී ජීන්-ප්‍රංශුවා කෝබට් පෙන්වා දුන් පරිදි, ඉහත කේතය වලංගු වන්නේ ධනාත්මක සංඛ්‍යා පමණක් වන අතර එය මගේ භාවිතයේ වැඩි කොටසක් ආවරණය කරයි. පහත දැක්වෙන්නේ ඔබේ පද්ධතියේ භාවිතා කරන සුපුරුදු පෙදෙසි අනුව දශම සංඛ්‍යා නිවැරදිව වලංගු කරන යාවත්කාලීන කේතය, දශම බෙදුම්කරු සිදුවන්නේ එක් වරක් පමණක් බව උපකල්පනය කරමිනි.

public static boolean isStringNumeric( String str )
{
    DecimalFormatSymbols currentLocaleSymbols = DecimalFormatSymbols.getInstance();
    char localeMinusSign = currentLocaleSymbols.getMinusSign();

    if ( !Character.isDigit( str.charAt( 0 ) ) && str.charAt( 0 ) != localeMinusSign ) return false;

    boolean isDecimalSeparatorFound = false;
    char localeDecimalSeparator = currentLocaleSymbols.getDecimalSeparator();

    for ( char c : str.substring( 1 ).toCharArray() )
    {
        if ( !Character.isDigit( c ) )
        {
            if ( c == localeDecimalSeparator && !isDecimalSeparatorFound )
            {
                isDecimalSeparatorFound = true;
                continue;
            }
            return false;
        }
    }
    return true;
}

4
දශම බෙදුම්කරු ද මෙය අසාර්ථක වීමට හේතු නොවේද?
ජීන්-ප්‍රංශුවා කෝබට්

1
@ ජීන්-ප්‍රංශුවා කෝර්බෙට්: හොඳ කරුණක් නම්, මම දශම බෙදුම්කරුවන් පිළිගන්නා නව එකක් සමඟ කේතය යාවත්කාලීන කර ඇත්තෙමි.
ඉබ්‍රාහිම් අරීෆ්

2
-V ලකුණ මෙම ශ්‍රිතය අසමත් වේද?
java_mouse

3
ඇමතුම් toCharArray()නූල් මනේන්ද්රියටය නිසා, සංගීත වස්තුව අරාව පිටපතක් නිර්මාණය කරනු ඇත. charAt(int index)සංගීත වස්තුවෙහි ක්‍රමය කෙලින්ම භාවිතා කිරීමට බොහෝ විට වේගවත් වේ .
මයික් කුසේරා

2
StringIndexOutOfBoundsExceptionදිග 0 සහිත නූලක් පසු කළ විට උත්පාදනය වනු ඇතif(str.length() == 0) return false;
samgak

43

ගූගල් හි ගුවා පුස්තකාලය මෙය කිරීමට හොඳ උපකාරක ක්‍රමයක් සපයයි : Ints.tryParse. ඔබ එය භාවිතා කරන Integer.parseIntනමුත් එය nullවලංගු පූර්ණ සංඛ්‍යාවක් වෙත විග්‍රහ නොකරන්නේ නම් එය ව්‍යතිරේකයක් විසි කරනවාට වඩා නැවත පැමිණේ . එය ඉන්ටීරියර් නොව ඉන්ටර්ජර් ලබා දෙන බව සලකන්න, එබැවින් ඔබට එය නැවත ඉන්ටර් බවට පරිවර්තනය කළ යුතුය.

උදාහරණයක්:

String s1 = "22";
String s2 = "22.2";
Integer oInt1 = Ints.tryParse(s1);
Integer oInt2 = Ints.tryParse(s2);

int i1 = -1;
if (oInt1 != null) {
    i1 = oInt1.intValue();
}
int i2 = -1;
if (oInt2 != null) {
    i2 = oInt2.intValue();
}

System.out.println(i1);  // prints 22
System.out.println(i2);  // prints -1

කෙසේ වෙතත්, වර්තමාන නිකුතුවට අනුව - ගුවා r11 - එය තවමත් @ බීටා ලෙස සලකුණු කර ඇත.

මම එය මිණුම් සලකුණු කර නැත. ප්‍රභව කේතය දෙස බැලීමේදී බොහෝ සනීපාරක්ෂාව පිරික්සීමෙන් යම්කිසි පොදු කාර්යයක් ඇත, නමුත් අවසානයේදී ඒවා භාවිතා කරන්නේ Character.digit(string.charAt(idx))සමාන, නමුත් ඊට වඩා තරමක් වෙනස්, ඉහත @ ඉබ්‍රාහිම්ගේ පිළිතුරෙනි. ඒවා ක්‍රියාත්මක කිරීමේදී ආවරණ යටතේ ඉහළින් හැසිරවීම ව්‍යතිරේකයක් නොමැත.


තර්කය අහෝසි වුවහොත් මෙය NPE විසි කරන බවට පරිස්සම් වන්න.
වඩ්සිම්

30

ඔබේ අගයන් වලංගු කිරීම සඳහා ව්‍යතිරේක භාවිතා නොකරන්න. Apache NumberUtils වැනි Util libs භාවිතා කරන්න:

NumberUtils.isNumber(myStringValue);

සංස්කරණය කරන්න :

ඔබේ නූල 0 කින් ආරම්භ වන්නේ නම්, අංක යූටිල්ස් ඔබේ අගය ෂඩාස්රාකාර ලෙස අර්ථ නිරූපණය කරන බව කරුණාවෙන් සලකන්න.

NumberUtils.isNumber("07") //true
NumberUtils.isNumber("08") //false

7
පිළිගත් පිළිතුර, මීට වසර තුනකට පෙර, දැනටමත් ආවරණය කර Number.isNumber()ඇත.
ඇන්ඩි තෝමස්

මම හිතන්නේ නැහැ. එය යාවත්කාලීන කරන ලදි හෝ පිළිගත් පිළිතුර වෙනස් කරන ලදි. මට මතකයි පිළිගත් පිළිතුර අංක යූටිල්ස් ආවරණය නොකළ නිසා මම මගේ පිළිතුර එකතු කළේ. නමුත් අදහස් දැක්වීමට ස්තූතියි
ගූට්

2
Oot ගූට් - පිළිගත් පිළිතුරේ ඉතිහාසය පෙන්නුම් කරන්නේ පිළිතුරේ Number.isNumber()පළමු අනුවාදයේ සිට සැප්තැම්බර් 24 '12 දින 17:01 ට ය.
ඇන්ඩි තෝමස්

Oot ගූට්, මෙය ස්ට්‍රිං යූටිල්ස් මෙන් නොව දශම අගය පිරික්සුම ආවරණය කරන බැවින් මෙය ඉතා හොඳයි.
හීනා හුසේන්

24

හැමෝම ව්‍යතිරේක / රීජෙක්ස් විසඳුම් සඳහා පෙළඹෙන්නේ ඇයි?

බොහෝ අය උත්සාහ කිරීම / අල්ලා ගැනීම භාවිතා කිරීම හොඳ බව මට තේරුම් ගත හැකි අතර, ඔබට එය නිතර කිරීමට අවශ්‍ය නම් ... එය අතිශයින්ම බදු අය කළ හැකිය.

මා මෙහි කළේ වඩාත්ම කාර්යක්ෂම වන්නේ කුමක් දැයි බැලීමට රීජෙක්ස්, පාර්ස්නම්බර් () ක්‍රම සහ අරාව සෙවීමේ ක්‍රමය ගැනීමයි. මෙවර මම පූර්ණ සංඛ්‍යා දෙස බැලුවෙමි.

public static boolean isNumericRegex(String str) {
    if (str == null)
        return false;
    return str.matches("-?\\d+");
}

public static boolean isNumericArray(String str) {
    if (str == null)
        return false;
    char[] data = str.toCharArray();
    if (data.length <= 0)
        return false;
    int index = 0;
    if (data[0] == '-' && data.length > 1)
        index = 1;
    for (; index < data.length; index++) {
        if (data[index] < '0' || data[index] > '9') // Character.isDigit() can go here too.
            return false;
    }
    return true;
}

public static boolean isNumericException(String str) {
    if (str == null)
        return false;
    try {  
        /* int i = */ Integer.parseInt(str);
    } catch (NumberFormatException nfe) {  
        return false;  
    }
    return true;
}

මට ලැබුණු වේගයේ ප්‍රති results ල:

Done with: for (int i = 0; i < 10000000; i++)...

With only valid numbers ("59815833" and "-59815833"):
    Array numeric took 395.808192 ms [39.5808192 ns each]
    Regex took 2609.262595 ms [260.9262595 ns each]
    Exception numeric took 428.050207 ms [42.8050207 ns each]
    // Negative sign
    Array numeric took 355.788273 ms [35.5788273 ns each]
    Regex took 2746.278466 ms [274.6278466 ns each]
    Exception numeric took 518.989902 ms [51.8989902 ns each]
    // Single value ("1")
    Array numeric took 317.861267 ms [31.7861267 ns each]
    Regex took 2505.313201 ms [250.5313201 ns each]
    Exception numeric took 239.956955 ms [23.9956955 ns each]
    // With Character.isDigit()
    Array numeric took 400.734616 ms [40.0734616 ns each]
    Regex took 2663.052417 ms [266.3052417 ns each]
    Exception numeric took 401.235906 ms [40.1235906 ns each]

With invalid characters ("5981a5833" and "a"):
    Array numeric took 343.205793 ms [34.3205793 ns each]
    Regex took 2608.739933 ms [260.8739933 ns each]
    Exception numeric took 7317.201775 ms [731.7201775 ns each]
    // With a single character ("a")
    Array numeric took 291.695519 ms [29.1695519 ns each]
    Regex took 2287.25378 ms [228.725378 ns each]
    Exception numeric took 7095.969481 ms [709.5969481 ns each]

With null:
    Array numeric took 214.663834 ms [21.4663834 ns each]
    Regex took 201.395992 ms [20.1395992 ns each]
    Exception numeric took 233.049327 ms [23.3049327 ns each]
    Exception numeric took 6603.669427 ms [660.3669427 ns each] if there is no if/null check

වියාචනය: මෙම ක්‍රම 100% ප්‍රශස්ත යැයි මම නොකියමි, ඒවා දත්ත නිරූපණය කිරීම සඳහා පමණි

ව්‍යතිරේකයන් දිනන්නේ අංක 4 ක් හෝ ඊට අඩු නම් පමණක් වන අතර සෑම නූලක්ම සෑම විටම සංඛ්‍යාවක් වේ ... කුමන අවස්ථාවකදී පවා චෙක්පතක් ඇත්තේ ඇයි?

කෙටියෙන් කිවහොත්, ඔබ උත්සාහය / ඇල්ලීම සමඟ නිතර වලංගු නොවන සංඛ්‍යා වලට දුවන්නේ නම් එය අතිශයින්ම වේදනාකාරී වේ. මම සැමවිටම අනුගමනය කරන වැදගත් රීතියක් නම් වැඩසටහන් ප්‍රවාහය සඳහා කිසි විටෙකත් උත්සාහ නොකරන්න . මෙය උදාහරණයක්.

සිත්ගන්නා කරුණ නම් සරල නම් වර්‍ගය <0 || > 9 ලිවීමට අතිශයින්ම සරලයි, මතක තබා ගැනීමට පහසුය (සහ විවිධ භාෂාවලින් වැඩ කළ යුතුය) සහ සියලු පරීක්ෂණ අවස්ථා පාහේ ජය ගනී.

මෙහි ඇති අවාසිය නම් මම අනුමාන කරන්නේ Integer.parseInt () ASCII නොවන සංඛ්‍යා හැසිරවිය හැකි නමුත් අරාව සෙවීමේ ක්‍රමය එසේ නොකරන බවයි.


අරා අරා එකක් මතක තබා ගැනීම පහසු යැයි මා කීවේ ඇයිදැයි කල්පනා කරන අයට, negative ණාත්මක සං signs ා නොමැති බව ඔබ දන්නේ නම්, ඔබට cond නීභවනය වූ දෙයක් සමඟ පහසුවෙන් ගැලවිය හැකිය:

public static boolean isNumericArray(String str) {
    if (str == null)
        return false;
    for (char c : str.toCharArray())
        if (c < '0' || c > '9')
            return false;
    return true;

අවසාන සටහනක් ලෙස, පිළිගත් උදාහරණයේ දී සියලු ඡන්ද ඉහළට ඔසවා තැබීමේ ක්‍රියාකරු ගැන මට කුතුහලයක් ඇති විය. පැවරුමට එකතු කිරීම

double d = Double.parseDouble(...)

ඔබ වටිනාකම පවා භාවිතා නොකරන බැවින් එය නිෂ් less ල නොවේ, නමුත් එය සැකසීමේ කාලය නාස්ති කරන අතර ධාවන කාලය නැනෝ තත්පර කිහිපයකින් වැඩි කරයි (එමඟින් පරීක්ෂණ 100-200 ms වැඩි වීමට හේතු විය). කාර්ය සාධනය අඩු කිරීම සඳහා එය අතිරේක වැඩක් බැවින් කිසිවෙකු එසේ කරන්නේ මන්දැයි මට නොපෙනේ.

ඔබ සිතන්නේ එය ප්‍රශස්ත වනු ඇති බවයි ... සමහර විට මම බයිට් කේතය පරීක්ෂා කර සම්පාදකයා කරන්නේ කුමක්දැයි බලන්න. එය කෙසේ හෝ ප්‍රශස්තිකරණය කළත් එය සෑම විටම මට වඩා දිගු ලෙස පෙන්වීමට හේතුව එය පැහැදිලි නොකරයි ... එබැවින් සිදුවන්නේ කුමක්දැයි මම කල්පනා කරමි. සටහනක් ලෙස: දිගින්, මම අදහස් කළේ 10000000 පුනරාවර්තන සඳහා පරීක්ෂණය ධාවනය කිරීම සහ එම වැඩසටහන කිහිප වතාවක් ධාවනය කිරීම (10x +) සෑම විටම එය මන්දගාමී බව පෙන්නුම් කරයි.

සංස්කරණය කරන්න: Character.isDigit () සඳහා පරීක්ෂණයක් යාවත්කාලීන කරන ලදි


4
මෙය සෑම විටම නව නිත්‍ය ප්‍රකාශනයක් සම්පාදනය කරන්නේ නැද්ද? එය ඉතා කාර්යක්ෂම බවක් නොපෙනේ.
සැමුවෙල් එඩ්වින් වෝඩ්

1
Am සාමුවෙල් එඩ්වින් වෝඩ් මා මෙම ලිපිය සෑදීමට මුලු හේතුවමයි ... රීජෙක්ස් උදාහරණය අනෙක් පුද්ගලයින් විසින් සපයන ලද පිළිතුරු භාවිතා කළ අතර එය කෙතරම් අකාර්යක්ෂමද යන්න පෙන්නුම් කළේය. ඔබ රීජෙක්ස් කල්තියා සම්පාදනය කිරීමට උත්සාහ කළත් එය භාවිතා කිරීම පමණක් කළත්, කාල වෙනස්කම් වන්නේ: වෙනත් සපයන ලද පුද්ගලයින්ගෙන් මා විසින් පළ කරන ලද රීජෙක්ස් සඳහා එම්එස් 2587, වේලාවට පෙර සම්පාදනය කරන විට එම්එස් 950, එය සිදු කරන විට එම්එස් 144 සංඛ්‍යාත්මක අරාව (එකම නූලෙහි මිලි 1 පුනරාවර්තන සඳහා). කාලයට පෙර සම්පාදනය කිරීම පැහැදිලිවම උපකාරී වනු ඇත, නමුත් කනගාටුදායක ලෙස එය තවමත් අරාව ක්‍රමයට වඩා පහත් මට්ටමක පවතී ... මා නොදන්නා යම් උමතු ප්‍රශස්තිකරණයක් නොමැති නම්.
වතුර

රෙජෙක්ස් දේවල් වේගවත් කරයි යැයි විශ්වාස කිරීම බොහෝ දුරට වැරැද්දකි. එහි එක් සෙවීමක් නම්, ඔව්, මට එය ලැබුණා ... නමුත් කාර්යක්ෂමව ලියා ඇති කේතයක් ඔබව කම්පනයට පත් කිරීමට තරම් රීජෙක්ස් ඉක්මවා යන බව මම දැක ඇත්තෙමි! නියම පෝස්ට් ater වෝටර්
යෝ ඇප්ස්

19
public static boolean isNumeric(String str)
{
    return str.matches("-?\\d+(.\\d+)?");
}

ක්‍රේග්ටීපී හි නිත්‍ය ප්‍රකාශනය (ඉහත පෙන්වා ඇත) සමහර ව්‍යාජ ධනාත්මක ප්‍රති produce ල ඇති කරයි. උදා: "23y4" අංකයක් ලෙස ගණන් ගනු ලබන්නේ '.' ඕනෑම අක්‍ෂරයකට දශම ලක්ෂ්‍යයට නොගැලපේ.

ප්‍රමුඛ '+' සහිත ඕනෑම අංකයක් එය ප්‍රතික්ෂේප කරයි

මෙම සුළු ගැටළු දෙක මඟහරින විකල්පයකි

public static boolean isNumeric(String str)
{
    return str.matches("[+-]?\\d*(\\.\\d+)?");
}

මෙම ආපසු trueතනි ප්ලස් "+"හෝ ඍණ "-", සහ falseසඳහා"0."
user85421

තනි ප්ලස් හෝ us ණ මත හොඳ ඇල්ලීම. යනු "0." වලංගු අංකයක්?
user872985

"0."සඳහා වලංගු වන Double.parseDouble()අතර එය JLS ( §3.10.2 ) අනුව වලංගු වචනාර්ථයකි !
user85421

නිත්‍ය ප්‍රකාශන නිර්මාණය කිරීම ද මිල අධිකය. නිත්‍ය ප්‍රකාශනය එක් වරක් නිර්මාණය කර නැවත භාවිතා කළ යුතුය
ඩැනියෙල් නුරියෙව්

1
ඔබ එය වෙනස් කළ යුතුයිmatches("-?\\d+([.]\\d+)?")
බොබ්ස්

15

අපට ලබා දී ඇති නූලෙන් සියලු සංඛ්‍යා ("") එනම් හිස් අවකාශය සමඟ ප්‍රතිස්ථාපනය කිරීමට උත්සාහ කළ හැකි අතර ඉන් පසුව නූල් වල දිග ශුන්‍ය නම් අපට ලබා දී ඇති නූලට ඇත්තේ සංඛ්‍යා පමණක් බව අපට පැවසිය හැකිය. [ඔබට මෙම පිළිතුර ප්‍රයෝජනවත් යැයි හැඟුනේ නම් කරුණාකර එය ඡන්දය දීම ගැන සලකා බලන්න] උදාහරණය:

boolean isNumber(String str){
        if(str.length() == 0)
            return false; //To check if string is empty

        if(str.charAt(0) == '-')
            str = str.replaceFirst("-","");// for handling -ve numbers

        System.out.println(str);

        str = str.replaceFirst("\\.",""); //to check if it contains more than one decimal points

        if(str.length() == 0)
            return false; // to check if it is empty string after removing -ve sign and decimal point
        System.out.println(str);

        return str.replaceAll("[0-9]","").length() == 0;
    }

1
ඒ නිසා ""ගණනාවක් වන නමුත් "3.14"සහ "-1"නේද?
එරික් ඩුමිනිල්

1
පැහැදිලිවම සියලු සංඛ්‍යා ආකෘති වලට අදාළ නොවේ, නමුත් මෙහි වෙනස් ආකාරයකින් සිතීම සඳහා ඉහළ නැංවීමක් ඇත ... මුල් සිතුවිල්ල ඔබේ නම්, එනම්.
gbenroscience

12

ඔබට භාවිතා කළ හැකිය NumberFormat#parse:

try
{
     NumberFormat.getInstance().parse(value);
}
catch(ParseException e)
{
    // Not a number.
}

සංස්කරණයක් ඉදිරිපත් කළේය - .getInstance () අස්ථානගත වී ඇත. +1 මෙම ප්‍රශ්නය සොයා ගැනීමේදී මා සමඟ ගිය පිළිතුර මෙයයි.
8bitjunkie

6
පුළුල් ලෙස භාවිතා කරන්නේ නම් මිල
අධිකය

1
අවසානයේ කුණු කසළ තිබේ නම් එය ද සමත් වනු ඇත value.
බ්‍රයන් වයිට්

ඔබ ව්‍යතිරේකය ලොග් නොකළහොත් එය සොනාර් ගැටළුවක් නිර්මාණය කරයි
jmhostalet

1
Double.parseDouble ක්‍රියා නොකරන 0x0001 අංක ආකෘතිය සඳහා මෙය ක්‍රියාත්මක විය. +1
සීබාස් 77

11

ඇන්ඩ්‍රොයිඩ් යෙදුම සංවර්ධනය කිරීම සඳහා ඔබ ජාවා භාවිතා කරන්නේ නම්, ඔබට TextUtils.isDigitsOnly ශ්‍රිතය භාවිතා කළ හැකිය .


8

මෙන්න මගේ ප්‍රශ්නයට පිළිතුර විය.

ඕනෑම ආකාරයක විග්‍රහයක් සමඟ ඕනෑම නූලක් විග්‍රහ කිරීමට ඔබට භාවිතා කළ හැකි සියලු පහසුවක් අල්ලා ගන්න : isParsable(Object parser, String str). විග්‍රහකය a Classහෝ a විය හැකිය object. මෙය ඔබ ලියා ඇති අභිරුචි විග්‍රහයන් භාවිතා කිරීමට ඉඩ ලබා දෙන අතර එය සදාකාලිකව ක්‍රියාත්මක විය යුතුය, උදා:

isParsable(Integer.class, "11");
isParsable(Double.class, "11.11");
Object dateFormater = new java.text.SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
isParsable(dateFormater, "2001.07.04 AD at 12:08:56 PDT");

මෙන්න මගේ කේතය ක්‍රම විස්තර සමඟ සම්පූර්ණයි.

import java.lang.reflect.*;

/**
 * METHOD: isParsable<p><p>
 * 
 * This method will look through the methods of the specified <code>from</code> parameter
 * looking for a public method name starting with "parse" which has only one String
 * parameter.<p>
 * 
 * The <code>parser</code> parameter can be a class or an instantiated object, eg:
 * <code>Integer.class</code> or <code>new Integer(1)</code>. If you use a
 * <code>Class</code> type then only static methods are considered.<p>
 * 
 * When looping through potential methods, it first looks at the <code>Class</code> associated
 * with the <code>parser</code> parameter, then looks through the methods of the parent's class
 * followed by subsequent ancestors, using the first method that matches the criteria specified
 * above.<p>
 * 
 * This method will hide any normal parse exceptions, but throws any exceptions due to
 * programmatic errors, eg: NullPointerExceptions, etc. If you specify a <code>parser</code>
 * parameter which has no matching parse methods, a NoSuchMethodException will be thrown
 * embedded within a RuntimeException.<p><p>
 * 
 * Example:<br>
 * <code>isParsable(Boolean.class, "true");<br>
 * isParsable(Integer.class, "11");<br>
 * isParsable(Double.class, "11.11");<br>
 * Object dateFormater = new java.text.SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");<br>
 * isParsable(dateFormater, "2001.07.04 AD at 12:08:56 PDT");<br></code>
 * <p>
 * 
 * @param parser    The Class type or instantiated Object to find a parse method in.
 * @param str   The String you want to parse
 * 
 * @return true if a parse method was found and completed without exception
 * @throws java.lang.NoSuchMethodException If no such method is accessible 
 */
public static boolean isParsable(Object parser, String str) {
    Class theClass = (parser instanceof Class? (Class)parser: parser.getClass());
    boolean staticOnly = (parser == theClass), foundAtLeastOne = false;
    Method[] methods = theClass.getMethods();

    // Loop over methods
    for (int index = 0; index < methods.length; index++) {
        Method method = methods[index];

        // If method starts with parse, is public and has one String parameter.
        // If the parser parameter was a Class, then also ensure the method is static. 
        if(method.getName().startsWith("parse") &&
            (!staticOnly || Modifier.isStatic(method.getModifiers())) &&
            Modifier.isPublic(method.getModifiers()) &&
            method.getGenericParameterTypes().length == 1 &&
            method.getGenericParameterTypes()[0] == String.class)
        {
            try {
                foundAtLeastOne = true;
                method.invoke(parser, str);
                return true; // Successfully parsed without exception
            } catch (Exception exception) {
                // If invoke problem, try a different method
                /*if(!(exception instanceof IllegalArgumentException) &&
                   !(exception instanceof IllegalAccessException) &&
                   !(exception instanceof InvocationTargetException))
                        continue; // Look for other parse methods*/

                // Parse method refuses to parse, look for another different method
                continue; // Look for other parse methods
            }
        }
    }

    // No more accessible parse method could be found.
    if(foundAtLeastOne) return false;
    else throw new RuntimeException(new NoSuchMethodException());
}


/**
 * METHOD: willParse<p><p>
 * 
 * A convienence method which calls the isParseable method, but does not throw any exceptions
 * which could be thrown through programatic errors.<p>
 * 
 * Use of {@link #isParseable(Object, String) isParseable} is recommended for use so programatic
 * errors can be caught in development, unless the value of the <code>parser</code> parameter is
 * unpredictable, or normal programtic exceptions should be ignored.<p>
 * 
 * See {@link #isParseable(Object, String) isParseable} for full description of method
 * usability.<p>
 * 
 * @param parser    The Class type or instantiated Object to find a parse method in.
 * @param str   The String you want to parse
 * 
 * @return true if a parse method was found and completed without exception
 * @see #isParseable(Object, String) for full description of method usability 
 */
public static boolean willParse(Object parser, String str) {
    try {
        return isParsable(parser, str);
    } catch(Throwable exception) {
        return false;
    }
}

5

ASCII ඉලක්කම් පමණක් අඩංගු වන ධනාත්මක පදනම්-දස සංඛ්‍යා සමඟ සැසඳීමට, භාවිතා කරන්න:

public static boolean isNumeric(String maybeNumeric) {
    return maybeNumeric != null && maybeNumeric.matches("[0-9]+");
}

5

හොඳින් ක්‍රියා කරන ප්‍රවේශයක් උත්සාහය අල්ලා ගැනීමෙන් වැළකී negative ණ සංඛ්‍යා හා විද්‍යාත්මක අංකනය හැසිරවීම.

Pattern PATTERN = Pattern.compile( "^(-?0|-?[1-9]\\d*)(\\.\\d+)?(E\\d+)?$" );

public static boolean isNumeric( String value ) 
{
    return value != null && PATTERN.matcher( value ).matches();
}

5

නූලක් සංඛ්‍යාත්මකදැයි පරීක්ෂා කිරීම සඳහා මෙන්න මගේ පන්තිය. එය සංඛ්‍යාත්මක නූල් ද සවි කරයි:

විශේෂාංග:

  1. අනවශ්‍ය ශුන්‍යයන් ඉවත් කරයි ["12.0000000" -> "12"]
  2. අනවශ්‍ය ශුන්‍යයන් ඉවත් කරයි ["12.0580000" -> "12.058"]
  3. සංඛ්‍යාත්මක නොවන අක්ෂර ඉවත් කරයි ["12.00sdfsdf00" -> "12"]
  4. සෘණ නූල් අගයන් හසුරුවයි ["-12,020000" -> "-12.02"]
  5. බහු තිත් ඉවත් කරයි ["-12.0.20.000" -> "-12.02"]
  6. අමතර පුස්තකාල නොමැත, සම්මත ජාවා පමණි

හියර් යූ ගෝ...

public class NumUtils {
    /**
     * Transforms a string to an integer. If no numerical chars returns a String "0".
     *
     * @param str
     * @return retStr
     */
    static String makeToInteger(String str) {
        String s = str;
        double d;
        d = Double.parseDouble(makeToDouble(s));
        int i = (int) (d + 0.5D);
        String retStr = String.valueOf(i);
        System.out.printf(retStr + "   ");
        return retStr;
    }

    /**
     * Transforms a string to an double. If no numerical chars returns a String "0".
     *
     * @param str
     * @return retStr
     */
    static String makeToDouble(String str) {

        Boolean dotWasFound = false;
        String orgStr = str;
        String retStr;
        int firstDotPos = 0;
        Boolean negative = false;

        //check if str is null
        if(str.length()==0){
            str="0";
        }

        //check if first sign is "-"
        if (str.charAt(0) == '-') {
            negative = true;
        }

        //check if str containg any number or else set the string to '0'
        if (!str.matches(".*\\d+.*")) {
            str = "0";
        }

        //Replace ',' with '.'  (for some european users who use the ',' as decimal separator)
        str = str.replaceAll(",", ".");
        str = str.replaceAll("[^\\d.]", "");

        //Removes the any second dots
        for (int i_char = 0; i_char < str.length(); i_char++) {
            if (str.charAt(i_char) == '.') {
                dotWasFound = true;
                firstDotPos = i_char;
                break;
            }
        }
        if (dotWasFound) {
            String befDot = str.substring(0, firstDotPos + 1);
            String aftDot = str.substring(firstDotPos + 1, str.length());
            aftDot = aftDot.replaceAll("\\.", "");
            str = befDot + aftDot;
        }

        //Removes zeros from the begining
        double uglyMethod = Double.parseDouble(str);
        str = String.valueOf(uglyMethod);

        //Removes the .0
        str = str.replaceAll("([0-9])\\.0+([^0-9]|$)", "$1$2");

        retStr = str;

        if (negative) {
            retStr = "-"+retStr;
        }

        return retStr;

    }

    static boolean isNumeric(String str) {
        try {
            double d = Double.parseDouble(str);
        } catch (NumberFormatException nfe) {
            return false;
        }
        return true;
    }

}

5

Regex ගැලපීම

වැඩි දියුණු කිරීම් සහිත "ක්‍රේග්ටීපී" රීජෙක්ස් ගැලපීම තවත් උදාහරණයක් මෙන්න.

public static boolean isNumeric(String str)
{
    return str.matches("^(?:(?:\\-{1})?\\d+(?:\\.{1}\\d+)?)$");
}
  1. එක් negative ණ ලකුණක් පමණක් -අවසර දී ඇති අතර එය ආරම්භයේ තිබිය යුතුය.
  2. සෘණ ලකුණෙන් පසු ඉලක්කම් තිබිය යුතුය.
  3. .අවසර දී ඇත්තේ එක් දශම ලකුණක් පමණි .
  4. දශම ලකුණට පසු ඉලක්කම් තිබිය යුතුය.

රීජෙක්ස් පරීක්ෂණය

1                  --                   **VALID**
1.                 --                   INVALID
1..                --                   INVALID
1.1                --                   **VALID**
1.1.1              --                   INVALID

-1                 --                   **VALID**
--1                --                   INVALID
-1.                --                   INVALID
-1.1               --                   **VALID**
-1.1.1             --                   INVALID

5

ව්‍යතිරේක මිල අධිකයි, නමුත් මේ අවස්ථාවේ දී රෙජෙක්ස් වැඩි කාලයක් ගතවේ. පහත කේතය මඟින් කාර්යයන් දෙකක සරල පරීක්ෂණයක් පෙන්වයි - එකක් ව්‍යතිරේක සහ තවත් රීජෙක්ස් භාවිතා කරයි. මගේ යන්ත්‍රයේ RegEx අනුවාදය ව්‍යතිරේකයට වඩා 10 ගුණයක් මන්දගාමී වේ.

import java.util.Date;


public class IsNumeric {

public static boolean isNumericOne(String s) {
    return s.matches("-?\\d+(\\.\\d+)?");  //match a number with optional '-' and decimal.      
}

public static boolean isNumericTwo(String s) {
    try {
        Double.parseDouble(s);
        return true;
    } catch (Exception e) {
        return false;
    }
}

public static void main(String [] args) {

    String test = "12345.F";

    long before = new Date().getTime();     
    for(int x=0;x<1000000;++x) {
        //isNumericTwo(test);
        isNumericOne(test);
    }
    long after = new Date().getTime();

    System.out.println(after-before);

}

}

සාමාන්‍යයෙන්, ටයිප් කළ ආදානය වැනි දෑ පරීක්ෂා කිරීමට මෙම කේතය භාවිතා කරනු ඇතැයි මම සිතමි. එවැනි අවස්ථාවක වේගය සලකා බැලීමක් නොවන අතර අංකයක් හෝ අංකයක් නොවන බව පරීක්ෂා කිරීම සඳහා ව්‍යතිරේකයක් විසි කිරීම තරම් කැත දෙයක් කිරීම වැරදිය.
user872985

සමහර විට නැත. ටයිප් කළ ආදානය සාමාන්‍යයෙන් UI සංරචකය මගින් පරීක්ෂා කරනු ලැබේ, එහිදී අගය ඉදිරිපත් කිරීමට පෙර දෝෂ වහාම පෙන්විය හැකිය. කාර්ය සාධනය වැදගත් වන විශාල ආදාන පෙළ ලිපිගොනු වලින් නූල් වලංගු කිරීම වඩාත් පොදු විය හැකිය. මෙහි මගේ පිළිතුරේ පරමාර්ථය වන්නේ පිළිගත් පිළිතුරෙහි “ව්‍යතිරේකයන් මන්දගාමී” ප්‍රකාශය ආමන්ත්‍රණය කිරීමයි. සංකීර්ණ රීජෙක්ස් වඩා මිල අධිකය. මගේ කේතයේ කිසිසේත් "අවලස්සන විසි කිරීමක්" නොමැත - උල්ලං .නයන් හඳුනා ගැනීමට වේගවත් ක්‍රමයක්. චෙක්-පළමු-පසුව-ගණනය කිරීමේ ප්‍රවේශයකින් ඔබ ආදානය හරහා ගමන් දෙකක් සිදු කරයි: එකක් සත්‍යාපනය කිරීමට සහ තවත් එකක් පරිවර්තනය කිරීමට.
ක්‍රිස්කාන්ට්‍රෙල්

5

// කරුණාකර පහත කේතය පරීක්ෂා කරන්න

public static boolean isDigitsOnly(CharSequence str) {
    final int len = str.length();
    for (int i = 0; i < len; i++) {
        if (!Character.isDigit(str.charAt(i))) {
            return false;
        }
    }
    return true;
}

ප්‍රශ්නය පවසන්නේ පූර්ණ සංඛ්‍යා නොවන අගයන් ඇතුළත් විය හැකි “සංඛ්‍යාත්මක” යන්නයි.
rghome

3
// only int
public static boolean isNumber(int num) 
{
    return (num >= 48 && c <= 57); // 0 - 9
}

// is type of number including . - e E 
public static boolean isNumber(String s) 
{
    boolean isNumber = true;
    for(int i = 0; i < s.length() && isNumber; i++) 
    {
        char c = s.charAt(i);
        isNumber = isNumber & (
            (c >= '0' && c <= '9') || (c == '.') || (c == 'e') || (c == 'E') || (c == '')
        );
    }
    return isInteger;
}

// is type of number 
public static boolean isInteger(String s) 
{
    boolean isInteger = true;
    for(int i = 0; i < s.length() && isInteger; i++) 
    {
        char c = s.charAt(i);
        isInteger = isInteger & ((c >= '0' && c <= '9'));
    }
    return isInteger;
}

public static boolean isNumeric(String s) 
{
    try
    {
        Double.parseDouble(s);
        return true;
    }
    catch (Exception e) 
    {
        return false;
    }
}

3

මෙම චෙක්පත සඳහා මෙය සරල උදාහරණයකි:

public static boolean isNumericString(String input) {
    boolean result = false;

    if(input != null && input.length() > 0) {
        char[] charArray = input.toCharArray();

        for(char c : charArray) {
            if(c >= '0' && c <= '9') {
                // it is a digit
                result = true;
            } else {
                result = false;
                break;
            }
        }
    }

    return result;
}

3

ඔබට java.util.Scanner වස්තුව භාවිතා කළ හැකිය.

public static boolean isNumeric(String inputData) {
      Scanner sc = new Scanner(inputData);
      return sc.hasNextInt();
    }

3

කිසිදු API එකක් භාවිතා නොකර සංඛ්‍යා සහ දශම පරික්ෂා කිරීම සඳහා මම යම් කොන්දේසි පැහැදිලි කර ඇත්තෙමි,

නිවැරදි අංක 1 අංකය පරීක්ෂා කරන්න

Character.isDigit(char)

නිවැරදි කිරීමේ දිග අංකය පරීක්ෂා කරන්න (දිග 6 යැයි උපකල්පනය කරන්න)

String number = "132452";
if(number.matches("([0-9]{6})"))
System.out.println("6 digits number identified");

අතර වෙනස්වන දිග අංකය පරීක්ෂා කරන්න (දිග 4 සිට 6 දක්වා උපකල්පනය කරන්න)

//  {n,m}  n <= length <= m
String number = "132452";
if(number.matches("([0-9]{4,6})"))
System.out.println("Number Identified between 4 to 6 length");

String number = "132";
if(!number.matches("([0-9]{4,6})"))
System.out.println("Number not in length range or different format");

අතර වෙනස්වන දිග දශම අංකය පරීක්ෂා කරන්න (දිග 4 සිට 7 දක්වා උපකල්පනය කරන්න)

//  It will not count the '.' (Period) in length
String decimal = "132.45";
if(decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Numbers Identified between 4 to 7");

String decimal = "1.12";
if(decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Numbers Identified between 4 to 7");

String decimal = "1234";
if(decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Numbers Identified between 4 to 7");

String decimal = "-10.123";
if(decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Numbers Identified between 4 to 7");

String decimal = "123..4";
if(!decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Decimal not in range or different format");

String decimal = "132";
if(!decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Decimal not in range or different format");

String decimal = "1.1";
if(!decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Decimal not in range or different format");

එය බොහෝ දෙනෙකුට උපකාරී වනු ඇතැයි සිතමි.


2

විද්‍යාත්මක අංකනය සහ තිත සහ කොමාව යන දෙකම දශම බෙදුම්කරුවන් ලෙස පිළිගැනීම සඳහා මම ක්‍රේග්ටීපී විසඳුම වෙනස් කළෙමි

^-?\d+([,\.]\d+)?([eE]-?\d+)?$

උදාහරණයක්

var re = new RegExp("^-?\d+([,\.]\d+)?([eE]-?\d+)?$");
re.test("-6546"); // true
re.test("-6546355e-4456"); // true
re.test("-6546.355e-4456"); // true, though debatable
re.test("-6546.35.5e-4456"); // false
re.test("-6546.35.5e-4456.6"); // false

2

.NET හි උත්සාහ කරන්න * ප්‍රවේශයට මා කැමති වන්නේ එබැවිනි. ජාවා ක්‍රමයට සමාන සාම්ප්‍රදායික විග්‍රහ ක්‍රමයට අමතරව ඔබට ට්‍රයිපාර්ස් ක්‍රමයක් ද ඇත. මම ජාවා වාක්‍ය ඛණ්ඩයේ (පරාමිතීන් පිටත?) හොඳ නැත, එබැවින් කරුණාකර පහත සඳහන් දෑ කිසියම් ව්‍යාජ කේතයක් ලෙස සලකන්න. එය සංකල්පය පැහැදිලි කළ යුතුය.

boolean parseInteger(String s, out int number)
{
    try {
        number = Integer.parseInt(myString);
        return true;
    } catch(NumberFormatException e) {
        return false;
    }
}

භාවිතය:

int num;
if (parseInteger("23", out num)) {
    // Do something with num.
}

ඔව්, ජාවා හි "පිටත පරාමිතීන්" නොමැති අතර පූර්ණ සංඛ්‍යා එතීම වෙනස් කළ නොහැකි බැවින් (ප්‍රතිදානය ගබඩා කිරීම සඳහා වලංගු යොමු කිරීමක් ලෙස භාවිතා කළ නොහැක), සංවේදී මුග්ධ විකල්පය වනුයේ විග්‍රහ කළහොත් අහෝසි විය හැකි පූර්ණ සංඛ්‍යා වස්තුවක් ආපසු ලබා දීමයි. අසමත් විය. අවලස්සන විකල්පයක් වනුයේ ප්‍රතිදාන පරාමිතිය ලෙස int [1] සමත් වීමයි.
fortran

ඔව්, ජාවාහි ප්‍රතිදාන පරාමිතීන් නොමැති වීමට හේතුව පිළිබඳ සාකච්ඡාවක් මට මතකයි. නමුත් බොක්සිං / අන්බොක්සිං සම්බන්ධව ජාවාගේ ක්‍රියාකාරිත්වය ගැන මා නොදන්නා නමුත්, පූර්ණ සංඛ්‍යාවක් (ශුන්‍ය ලෙස, අවශ්‍ය නම්) ආපසු ලබා දීම ද හොඳ ය.
ඔරිගන්ගෝස්ට්

4
මම ඊළඟ පුද්ගලයාට වඩා C # ට කැමතියි, නමුත් ජාවා හි විශේෂාංග නොමැති විට ජාවා ප්‍රශ්නයක් සඳහා .NET C # කේත ස්නිපටයක් එක් කිරීමෙන් කිසිදු ප්‍රයෝජනයක් නැත
ෂේන්

ඔබ ව්‍යතිරේකය ලොග් නොකළහොත් එය සොනාර් ගැටළුවක් නිර්මාණය කරයි
jmhostalet

2

එය විග්‍රහ කරන්න (එනම් සමඟ Integer#parseInt) සහ ව්‍යතිරේකය අල්ලා ගන්න. =)

පැහැදිලි කිරීම සඳහා: ඕනෑම අවස්ථාවක (පැහැදිලිවම) අංකය විග්‍රහ කළ හැකිදැයි parseInt ශ්‍රිතය පරික්ෂා කරන අතර ඔබට එය කෙසේ හෝ විග්‍රහ කිරීමට අවශ්‍ය නම්, ඇත්ත වශයෙන්ම විග්‍රහ කිරීම මඟින් ඔබ කිසිදු කාර්ය සාධනයක් ලබා නොගනී.

ඔබට එය විග්‍රහ කිරීමට අවශ්‍ය නැතිනම් (හෝ එය ඉතා කලාතුරකින් විග්‍රහ කරන්න) ඔබට එය වෙනස් ආකාරයකින් කිරීමට අවශ්‍ය විය හැකිය.


2
පුළුල් ලෙස භාවිතා කරන්නේ නම් මිල
අධිකය

ඔබ ව්‍යතිරේකය ලොග් නොකළහොත් එය සොනාර් ගැටළුවක් නිර්මාණය කරයි
jmhostalet

Double.parseDouble
Alex78191

2

ඔබට Apache Commons Lang වෙතින් NumberUtils.isCreatable () භාවිතා කළ හැකිය .

NumberUtils.isNumber 4.0 හි ඉවත් කරනු ලබන බැවින් ඒ වෙනුවට NumberUtils.isCreatable () භාවිතා කරන්න.


2

ජාවා 8 ධාරාව, ​​ලැම්බඩා ප්‍රකාශනය, ක්‍රියාකාරී අතුරුමුහුණත

සියලුම අවස්ථා හසුරුවනු ලැබේ ( නූල් ශුන්‍ය, නූල් හිස් ආදිය )

String someString = null; // something="", something="123abc", something="123123"

boolean isNumeric = Stream.of(someString)
            .filter(s -> s != null && !s.isEmpty())
            .filter(Pattern.compile("\\D").asPredicate().negate())
            .mapToLong(Long::valueOf)
            .boxed()
            .findAny()
            .isPresent();

2

වෙනත් පිළිතුරු පදනම් කරගෙන මා විසින්ම ලියන ලද අතර එය රටා හෝ ව්‍යතිරේක පරික්‍ෂා කිරීම සමඟ භාවිතා නොකරයි.

එය උපරිම min ණ ලකුණක් පරික්ෂා කරන අතර උපරිම දශම ලක්ෂයක් සඳහා පරික්ෂා කරයි.

මෙන්න උදාහරණ සහ ඒවායේ ප්‍රති results ල:

"1", "-1", "-1.5" සහ "-1.556" නැවත සත්‍ය වේ

"1..5", "1A.5", "1.5D", "-" සහ "- 1" ආපසු වැරදි ය

සටහන: අවශ්‍ය නම් ඔබට ස්ථානීය පරාමිතියක් පිළිගැනීමට මෙය වෙනස් කළ හැකි අතර එය දශම ෆෝමැට්සයිම්බල්ස් වෙත යොමු කළ හැකිය.

 public static boolean isNumeric(final String input) {
    //Check for null or blank string
    if(input == null || input.isBlank()) return false;

    //Retrieve the minus sign and decimal separator characters from the current Locale
    final var localeMinusSign = DecimalFormatSymbols.getInstance().getMinusSign();
    final var localeDecimalSeparator = DecimalFormatSymbols.getInstance().getDecimalSeparator();

    //Check if first character is a minus sign
    final var isNegative = input.charAt(0) == localeMinusSign;
    //Check if string is not just a minus sign
    if (isNegative && input.length() == 1) return false;

    var isDecimalSeparatorFound = false;

    //If the string has a minus sign ignore the first character
    final var startCharIndex = isNegative ? 1 : 0;

    //Check if each character is a number or a decimal separator
    //and make sure string only has a maximum of one decimal separator
    for (var i = startCharIndex; i < input.length(); i++) {
        if(!Character.isDigit(input.charAt(i))) {
            if(input.charAt(i) == localeDecimalSeparator && !isDecimalSeparatorFound) {
                isDecimalSeparatorFound = true;
            } else return false;
        }
    }
    return true;
}

1

නූලක් සංඛ්‍යාවක් දැයි විශ්වාසදායක ලෙස පැවසීමට ඇති එකම ක්‍රමය එය විග්‍රහ කිරීමයි. ඒ නිසා මම එය විග්‍රහ කරමි, එය අංකයක් නම්, ඔබට අංකය නොමිලයේ ලබා ගත හැකිය!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.