我有一个Java String
对象。我只需从中提取数字。我举个例子:
"123-456-789"
我想要"123456789"
是否有只提取数字的库函数?
感谢您的回答。在我尝试这些之前,我需要知道是否必须安装任何其他的llibraries?
答案 0 :(得分:484)
您可以使用正则表达式并删除非数字。
str = str.replaceAll("\\D+","");
答案 1 :(得分:44)
这是一个更详细的解决方案。不太优雅,但可能更快:
public static String stripNonDigits(
final CharSequence input /* inspired by seh's comment */){
final StringBuilder sb = new StringBuilder(
input.length() /* also inspired by seh's comment */);
for(int i = 0; i < input.length(); i++){
final char c = input.charAt(i);
if(c > 47 && c < 58){
sb.append(c);
}
}
return sb.toString();
}
测试代码:
public static void main(final String[] args){
final String input = "0-123-abc-456-xyz-789";
final String result = stripNonDigits(input);
System.out.println(result);
}
<强>输出:强>
0123456789
顺便说一句:我没有使用Character.isDigit(ch)因为它接受了除0 - 9之外的许多其他字符。
答案 2 :(得分:21)
public String extractDigits(String src) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < src.length(); i++) {
char c = src.charAt(i);
if (Character.isDigit(c)) {
builder.append(c);
}
}
return builder.toString();
}
答案 3 :(得分:19)
使用Google Guava:
CharMatcher.inRange('0','9').retainFrom("123-456-789")
<强>更新强>
使用Precomputed CharMatcher可以进一步提高效果
CharMatcher ASCII_DIGITS=CharMatcher.inRange('0','9').precomputed();
ASCII_DIGITS.retainFrom("123-456-789");
答案 4 :(得分:14)
input.replaceAll("[^0-9?!\\.]","")
这将忽略小数点。
例如:如果输入为445.3kg
,则输出为445.3
。
答案 5 :(得分:11)
使用Google Guava:
CharMatcher.DIGIT.retainFrom("123-456-789");
CharMatcher是可插拔的,使用起来非常有趣,例如,您可以执行以下操作:
String input = "My phone number is 123-456-789!";
String output = CharMatcher.is('-').or(CharMatcher.DIGIT).retainFrom(input);
输出== 123-456-789
答案 6 :(得分:6)
使用正则表达式来满足您的要求。
String num,num1,num2;
String str = "123-456-789";
String regex ="(\\d+)";
Matcher matcher = Pattern.compile( regex ).matcher( str);
while (matcher.find( ))
{
num = matcher.group();
System.out.print(num);
}
答案 7 :(得分:4)
我受到了代码肖恩·帕特里克·弗洛伊德(Sean Patrick Floyd)的启发,并为了获得最佳性能而重写了它。
public static String stripNonDigitsV2( CharSequence input ) {
if (input == null)
return null;
if ( input.length() == 0 )
return "";
char[] result = new char[input.length()];
int cursor = 0;
CharBuffer buffer = CharBuffer.wrap( input );
while ( buffer.hasRemaining() ) {
char chr = buffer.get();
if ( chr > 47 && chr < 58 )
result[cursor++] = chr;
}
return new String( result, 0, cursor );
}
我对非常长的字符串进行性能测试,编号最小,结果为:
顺便说一句,这取决于该字符串的长度。对于仅包含6个数字的字符串,番石榴慢50%,正则表达速度慢1倍
答案 8 :(得分:3)
您可以使用str.replaceAll("[^0-9]", "");
答案 9 :(得分:3)
public class FindDigitFromString
{
public static void main(String[] args)
{
String s=" Hi How Are You 11 ";
String s1=s.replaceAll("[^0-9]+", "");
//*replacing all the value of string except digit by using "[^0-9]+" regex.*
System.out.println(s1);
}
}
输出 11
答案 10 :(得分:2)
我已经完成了电话号码+9(987)124124的代码。
Unicode字符占用4个字节。
public static String stripNonDigitsV2( CharSequence input ) {
if (input == null)
return null;
if ( input.length() == 0 )
return "";
char[] result = new char[input.length()];
int cursor = 0;
CharBuffer buffer = CharBuffer.wrap( input );
int i=0;
while ( i< buffer.length() ) { //buffer.hasRemaining()
char chr = buffer.get(i);
if (chr=='u'){
i=i+5;
chr=buffer.get(i);
}
if ( chr > 39 && chr < 58 )
result[cursor++] = chr;
i=i+1;
}
return new String( result, 0, cursor );
}
答案 11 :(得分:2)
<强>代码:强>
public class saasa {
public static void main(String[] args) {
// TODO Auto-generated method stub
String t="123-456-789";
t=t.replaceAll("-", "");
System.out.println(t);
}
答案 12 :(得分:0)
import java.util.*;
public class FindDigits{
public static void main(String []args){
FindDigits h=new FindDigits();
h.checkStringIsNumerical();
}
void checkStringIsNumerical(){
String h="hello 123 for the rest of the 98475wt355";
for(int i=0;i<h.length();i++) {
if(h.charAt(i)!=' '){
System.out.println("Is this '"+h.charAt(i)+"' is a digit?:"+Character.isDigit(h.charAt(i)));
}
}
}
void checkStringIsNumerical2(){
String h="hello 123 for 2the rest of the 98475wt355";
for(int i=0;i<h.length();i++) {
char chr=h.charAt(i);
if(chr!=' '){
if(Character.isDigit(chr)){
System.out.print(chr) ;
}
}
}
}
}
答案 13 :(得分:0)
使用Kotlin和Lambda表达式,您可以这样做:
val digitStr = str.filter { it.isDigit() }