使用正则表达式替换空格的Java问题
这是一节分数课。当我使用类似“2/4”的字符串测试分数类时,我得到以下异常:使用正则表达式替换空格的Java问题,java,regex,Java,Regex,这是一节分数课。当我使用类似“2/4”的字符串测试分数类时,我得到以下异常: java.lang.NumberFormatException: For input string: "". 我认为这与试图替换空格时的sStringTo方法有关 public class Util{ static int findGCF(int a, int b){ a = Math.abs(a); b = Math.abs(b); while(a != b){ if (a
java.lang.NumberFormatException: For input string: "".
我认为这与试图替换空格时的sStringTo方法有关
public class Util{
static int findGCF(int a, int b){
a = Math.abs(a);
b = Math.abs(b);
while(a != b){
if (a>b) a = a-b; else b = b-a;
}
return (a);
}
static Fraction sIntTo(String s){ //"2"
int n = Integer.parseInt(s);
return new Fraction(n);
}
static Fraction sFractionTo(String s){ //"2/3"
s = s.trim();
int posSlash = s.indexOf("/");
int n = Integer.parseInt(s.substring(0,posSlash));
int m = Integer.parseInt(s.substring(posSlash + 1));
return new Fraction(n,m);
}
static Fraction sMixTo(String s){
s =s.trim();
int posB = s.indexOf(" ");
int posSlash = s.indexOf("/");
int w = Integer.parseInt(s.substring(0,posB));
int t = Integer.parseInt(s.substring(posB+1, posSlash));
int b = Integer.parseInt(s.substring(posSlash+1));
return new Fraction(w*b+t,b);
}
static Fraction sDecTo(String s){
s = s.trim();
int i = s.indexOf(".");
String sub = s.substring(i+1);
String sNoPeriod = s.substring(0,i) + sub;
int top = Integer.parseInt(sNoPeriod);
int bot = 1;
for(int j = 0; j<sub.length(); j++) bot = bot*10;
return new Fraction(top,bot);
}
static Fraction divFraction(Fraction f, Fraction g){
return new Fraction (f.num * g.den, f.den * g.num);
}
static Fraction addFraction(Fraction f, Fraction g){
return new Fraction (f.num * g.den + f.den * g.num, f.den*g.den);
}
static Fraction sStringTo(String s){
s=s.trim();
s= s.replaceAll("\\s*/\\S*", "/");// remove 0 or more blanks before & after slash
s = s.replaceAll("\\s+", " "); // all blanks to be one blank: 2 1/2
int posB = s.indexOf(" ");
int posSlash = s.indexOf("/");
int posPed = s.indexOf(".");
Fraction ans = null;
if(posB>-1){
if (posSlash>posB) { ans = sMixTo(s);}
}else{
if (posPed == -1 && posSlash == -1) ans = sIntTo(s); //integer only
else{
if(posSlash == -1) ans = sDecTo(s);// decimal only
else{
//with slash "2.1/2 2.1/2.1
Fraction f = sStringTo(s.substring(0,posSlash));
Fraction g = sStringTo(s.substring(posSlash+1));
ans = divFraction(f,g);
}
}
}
return ans;
}//sStringTo()
公共类Util{
静态int findGCF(int a,int b){
a=数学abs(a);
b=数学abs(b);
while(a!=b){
如果(a>b)a=a-b;否则b=b-a;
}
报税表(a);
}
静态分数到(字符串s){/“2”
int n=整数.parseInt(s);
返回新分数(n);
}
静态分数分式(字符串s){/“2/3”
s=s.修剪();
int posSlash=s.indexOf(“/”);
int n=Integer.parseInt(s.substring(0,posSlash));
int m=Integer.parseInt(s.substring(posSlash+1));
返回新分数(n,m);
}
静态分数sMixTo(字符串s){
s=s.修剪();
int posB=s.indexOf(“”);
int posSlash=s.indexOf(“/”);
intw=Integer.parseInt(s.substring(0,posB));
int t=Integer.parseInt(s.substring(posB+1,posSlash));
intb=Integer.parseInt(s.substring(posSlash+1));
返回新分数(w*b+t,b);
}
静态分数sDecTo(字符串s){
s=s.修剪();
int i=s.indexOf(“.”);
String sub=s.substring(i+1);
字符串snoperation=s.substring(0,i)+sub;
int top=Integer.parseInt(snopiriod);
int-bot=1;
对于(int j=0;j-1){
如果(posSlash>posB){ans=sMixTo(s);}
}否则{
如果(posPed==-1&&posSlash==-1)ans=sIntTo(s);//仅限整数
否则{
if(posSlash==-1)ans=sDecTo(s);//仅十进制
否则{
//带斜杠“2.1/2.1/2.1”
分数f=sStringTo(s.子串(0,posSlash));
分数g=sStringTo(s.substring(posSlash+1));
ans=分数(f,g);
}
}
}
返回ans;
}//sStringTo()
有问题的堆栈跟踪是:
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:662)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at Util.sIntTo(Util.java:17)
at Util.sStringTo(Util.java:75)
at Util.sStringTo(Util.java:81)
at Fraction.<init>(Fraction.java:31)
at Test.main(Test.java:6)
线程“main”java.lang.NumberFormatException中的异常:对于输入字符串:“
位于java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
位于java.base/java.lang.Integer.parseInt(Integer.java:662)
位于java.base/java.lang.Integer.parseInt(Integer.java:770)
在Util.sIntTo(Util.java:17)
在Util.sStringTo(Util.java:75)
在Util.sStringTo(Util.java:81)
分数。(Fraction.java:31)
at Test.main(Test.java:6)
看起来你只把一个只包含空白的字符串传递到<代码> StToTo()/<代码>中。你应该考虑删除所有空白,而不是仅仅把它放在一个单独的空间中。考虑改变<代码> s=S.RePASTALL(“\s+”,“”);< <代码> > <代码> s= S.RePATALL(“\s++”,“”)。我解决了这个问题。这是我的一个语法错误。发布相关代码请添加完整的堆栈跟踪。您可以发布sIntTo的定义吗?根据堆栈跟踪,问题在于该函数。我添加了其余代码
s=s.replaceAll(\\s*/\\s*,“/”)
,对吗?:)顺便说一句,否决票不是我的