如何从java中的输入字符串中提取数值
如何仅从输入字符串中提取数值?
例如,输入字符串可能如下所示:
String str="abc d 1234567890pqr 54897";
我只想要数值,即"1234567890"
和"54897"
。 所有字母和特殊字符都将被丢弃。
String str=" abc d 1234567890pqr 54897"; Pattern pattern = Pattern.compile("\\w+([0-9]+)\\w+([0-9]+)"); Matcher matcher = pattern.matcher(str); for(int i = 0 ; i < matcher.groupCount(); i++) { matcher.find(); System.out.println(matcher.group()); }
您可以使用Scanner
类中的.nextInt()
方法:
将输入的下一个标记扫描为int。
或者,您也可以这样做:
String str=" abc d 1234567890pqr 54897"; Pattern p = Pattern.compile("(\\d+)"); Matcher m = p.matcher(str); while(m.find()) { System.out.println(m.group(1)); }
使用yourString.toCharArray();
将字符串拆分为char数组yourString.toCharArray();
然后遍历字符并使用Character.isDigit(ch);
确定这是否是数值。 或者遍历整个字符串并使用str.charAt(i)
。 例如:
public static void main(String[] args) { String str = "abc d 1234567890pqr 54897"; StringBuilder myNumbers = new StringBuilder(); for (int i = 0; i < str.length(); i++) { if (Character.isDigit(str.charAt(i))) { myNumbers.append(str.charAt(i)); System.out.println(str.charAt(i) + " is a digit."); } else { System.out.println(str.charAt(i) + " not a digit."); } } System.out.println("Your numbers: " + myNumbers.toString()); }
你可以这样做:
Matcher m = Pattern.compile("\\d+").matcher(str); while (m.find()) { System.out.println(m.group(0)); }
你可以使用str = str.replaceAll("replaced_string","replacing_string");
String str=" abc d 1234567890pqr 54897"; String str_rep1=" abc d "; String str_rep2="pqr "; String result1=str.replaceAll("", str_rep1); String result2=str.replaceAll(",",str_rep2);
npinti建议也可以使用。
使用java Scanner类的示例
import java.util.Scanner; Scanner s = new Scanner( "abc d 1234567890pqr 54897" ); s.useDelimiter( "\\D+" ); while ( s.hasNextInt() ){ s.nextInt(); // get int }
如果你不想使用正则表达式,
String str = " abc d 1234567890pqr 54897"; char[] chars = new char[str.length()]; int i = 0; for (int j = 0; j < str.length(); j++) { char c = str.charAt(j); if (Character.isDigit(c)) { chars[i++] = c; if (j != chars.length - 1) continue; } if (chars[0] == '\0') continue; String num = new String(chars).trim(); System.out.println(num); chars = new char[str.length()]; i = 0; }
产量:1234567890 54897
您想要丢弃除数字和空格之外的所有内容:
String nums = input.replaceAll("[^0-9 ]", "").replaceAll(" +", " ").trim();
额外的调用会清理双倍和前导/尾随空格。
如果需要数组,请添加拆分:
String[] nums = input.replaceAll("[^0-9 ]", "").trim().split(" +");
您可以在空格上拆分字符串以获取单个条目,循环遍历它们,并尝试使用Integer
上的相关方法解析它们,使用try
/ catch
方法来处理解析数据失败的情况。 这可能是最直接的方法。
或者,您可以构造一个正则表达式以仅匹配数字并使用它来查找所有数字。 对于大字符串来说,这可能更具性能。 正则表达式看起来像`\ b \ d + \ b’。
更新:或者,如果这不是家庭作业或类似的(我假设你正在寻找自己实施它的线索,但这可能不是有效的),你可以使用@npinti给出的解决方案。 这可能是您应该在生产代码中采用的方法。
public static List extractNumbers(String string) { List numbers = new LinkedList (); char[] array = string.toCharArray(); Stack stack = new Stack (); for (int i = 0; i < array.length; i++) { if (Character.isDigit(array[i])) { stack.push(array[i]); } else if (!stack.isEmpty()) { String number = getStackContent(stack); stack.clear(); numbers.add(number); } } if(!stack.isEmpty()){ String number = getStackContent(stack); numbers.add(number); } return numbers; } private static String getStackContent(Stack stack) { StringBuilder sb = new StringBuilder(); Enumeration elements = stack.elements(); while (elements.hasMoreElements()) { sb.append(elements.nextElement()); } return sb.toString(); } public static void main(String[] args) { String str = " abc d 1234567890pqr 54897"; List extractNumbers = extractNumbers(str); for (String number : extractNumbers) { System.out.println(number); } }
只需提取数字
String str=" abc d 1234567890pqr 54897"; for(int i=0; i 47 && str.charAt(i) < 58) System.out.print(str.charAt(i));
另一个版本
String str=" abc d 1234567890pqr 54897"; boolean flag = false; for(int i=0; i 47 && str.charAt(i) < 58) { System.out.print(str.charAt(i)); flag = true; } else { System.out.print( flag ? '\n' : ""); flag = false; }
public class ExtractNum { public static void main(String args[]) { String input = "abc d 1234567890pqr 54897"; String digits = input.replaceAll("[^0-9.]",""); System.out.println("\nGiven Number is :"+digits); } }
String line = "This order was32354 placed 343434for 43411 QT ! OK?"; String regex = "[^\\d]+"; String[] str = line.split(regex); String required = ""; for(String st: str){ System.out.println(st); }
通过上面的代码,您将获得所有数值。 然后你可以合并它们或你想用这些数值做什么。
public static String convertBudgetStringToPriceInteger(String budget) { if (!AndroidUtils.isEmpty(budget) && !"0".equalsIgnoreCase(budget)) { double numbers = getNumericFromString(budget); if( budget.contains("Crore") ){ numbers= numbers* 10000000; }else if(budget.contains("Lac")){ numbers= numbers* 100000; } return removeTrailingZeroesFromDouble(numbers); }else{ return "0"; } }
从字母数字字符串中获取数值
public static double getNumericFromString(String string){ try { if(!AndroidUtils.isEmpty(string)){ String commaRemovedString = string.replaceAll(",",""); return Double.parseDouble(commaRemovedString.replaceAll("[Az]+$", "")); /*return Double.parseDouble(string.replaceAll("[^[0-9]+[.[0-9]]*]", "").trim());*/ } }catch (NumberFormatException e){ e.printStackTrace(); } return 0; }
例如。 如果我通过1.5 lac或15,0000或15 Crores,那么我们可以从这些fucntion获得数值。 我们可以根据需要定制字符串。 例如。 在1.5 Lac的情况下,结果将是150000
- JAXB不解组接口列表
- 无法将’org.springframework.batch.item.xml.StaxEventItemWriter’类型的值转换为必需的类型’org.springframework.batch.item.ItemReader’
- Swing:在JTable结构发生变化后,JScrollPane不会刷新
- JPA ManyToMany在哪里注释
- kie workbench部署战争不起作用(tomcat)
- 为什么Hibernate 4.2使用jandex和classmate,如果它的Maven POM将它们定义为测试范围?
- 写入XLSX文件(POI)时JVM崩溃
- 如果我删除struts2 .action扩展名,为什么welcome-file-list不起作用?
- LibGDX网格高度图法线和灯光