Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“如何转换字符串分数”;2/6“;变成两个整数?JAVA_Java_String_Integer_Java.util.scanner_Fractions - Fatal编程技术网

“如何转换字符串分数”;2/6“;变成两个整数?JAVA

“如何转换字符串分数”;2/6“;变成两个整数?JAVA,java,string,integer,java.util.scanner,fractions,Java,String,Integer,Java.util.scanner,Fractions,我正在做一个分数计算器,我已经有了所有运算的代码 但是现在我想创建一个扫描器,它接受一个字符串,并将字符串转换成2个整数(分子和分母) 用户输入的字符串应采用以下格式:数字/数字。如果是别的,我会让扫描仪再次出现 我已有的代码可以处理负的整数,因此-符号和0应该不会有问题。您可以始终使用分隔符拆分字符串,在本例中为/,然后输出并解析它们以获得分子和分母。您可以始终使用基于分隔符拆分字符串,在本例中为/,然后输出并解析它们以获得分子和分母。您可以使用带正则表达式的模式,同时,强制执行正确格式的字符

我正在做一个分数计算器,我已经有了所有运算的代码

但是现在我想创建一个
扫描器
,它接受一个
字符串
,并将
字符串
转换成2个
整数
(分子和分母)

用户输入的
字符串
应采用以下格式:数字/数字。如果是别的,我会让扫描仪再次出现


我已有的代码可以处理负的
整数
,因此
-
符号和
0
应该不会有问题。

您可以始终使用分隔符拆分字符串,在本例中为
/
,然后输出并解析它们以获得分子和分母。

您可以始终使用基于分隔符拆分字符串,在本例中为
/
,然后输出并解析它们以获得分子和分母。

您可以使用带正则表达式的模式,同时,强制执行正确格式的字符串,并使您能够提取分子和支配符:

Pattern inputPattern = 
    Pattern.compile("\\A(?<numerator>-?\\d+)[ ]*\\/[ ]*(?<denominator>-?\\d+)\\z");
Matcher matcher = inputPattern.matcher(inputString);
if (matcher.matches()) {
    //valid inputstring
    int numerator = Integer.parseInt(matcher.group("numerator"));
    int denominator = Integer.parseInt(matcher.group("denominator"));

} else {
    letTheScannerAppearAgain();
}
模式输入模式=
模式编译(“\\A(?-?\\d+[]*\\/[]*(?-?\\d+\\z”);
Matcher Matcher=inputPattern.Matcher(inputString);
if(matcher.matches()){
//有效输入字符串
int-numerator=Integer.parseInt(matcher.group(“分子”);
int分母=Integer.parseInt(matcher.group(“分母”);
}否则{
让扫描仪显示增益();
}
这里使用的模式包含两个命名组,用圆括号(…)标记,并用斜杠分隔(因为斜杠在正则表达式中也有含义,所以转义)
分子/分母可以以减号开头,并且应该至少包含一个数字。允许在斜杠前后使用空格。

您可以使用带有正则表达式的模式,同时强制执行正确格式的字符串,并允许您提取分子和支配符:

Pattern inputPattern = 
    Pattern.compile("\\A(?<numerator>-?\\d+)[ ]*\\/[ ]*(?<denominator>-?\\d+)\\z");
Matcher matcher = inputPattern.matcher(inputString);
if (matcher.matches()) {
    //valid inputstring
    int numerator = Integer.parseInt(matcher.group("numerator"));
    int denominator = Integer.parseInt(matcher.group("denominator"));

} else {
    letTheScannerAppearAgain();
}
模式输入模式=
模式编译(“\\A(?-?\\d+[]*\\/[]*(?-?\\d+\\z”);
Matcher Matcher=inputPattern.Matcher(inputString);
if(matcher.matches()){
//有效输入字符串
int-numerator=Integer.parseInt(matcher.group(“分子”);
int分母=Integer.parseInt(matcher.group(“分母”);
}否则{
让扫描仪显示增益();
}
这里使用的模式包含两个命名组,用圆括号(…)标记,并用斜杠分隔(因为斜杠在正则表达式中也有含义,所以转义)
分子/分母可以以减号开头,并且应该至少包含一个数字。斜杠前后允许有空格。

您可以在“/”上拆分字符串,并按以下方式提取分子和分母

public void scan(String string){
 if(string.matches("-{0,1}[0-9]+\\/[0-9]+"){
  String[] numbers = string.split("/");

  int numerator = Integer.parseInt(numbers[0]);
  int denominator = Integer.parseInt(numbers[1]);
 }
 else{
  scan(string);
 }
}

您可以在“/”上拆分字符串,并按以下方式提取分子和分母

public void scan(String string){
 if(string.matches("-{0,1}[0-9]+\\/[0-9]+"){
  String[] numbers = string.split("/");

  int numerator = Integer.parseInt(numbers[0]);
  int denominator = Integer.parseInt(numbers[1]);
 }
 else{
  scan(string);
 }
}
我就是这样做的:

int fTop, fBottom;
Fraction(String frak) {
    fTop = Integer.parseInt(frak.substring(0,frak.indexOf('/')));
    fBottom = Integer.parseInt(frak.substring(frak.indexOf('/')+1,frak.length())); 
}
我就是这样做的:

int fTop, fBottom;
Fraction(String frak) {
    fTop = Integer.parseInt(frak.substring(0,frak.indexOf('/')));
    fBottom = Integer.parseInt(frak.substring(frak.indexOf('/')+1,frak.length())); 
}

在这种情况下,如果用户输入“3/12”或没有“/”的其他内容,会发生什么情况?我添加了一个条件,如果扫描的格式不是number/number,将再次调用扫描。但我不明白你到底想怎么处理这个案子。按照上述方法将导致在不匹配期间出现无限循环。我可以处理else语句,非常感谢您的帮助。当字符串格式无效时,将导致堆栈溢出。在这种情况下,如果用户输入“3/12”,会发生什么情况或者没有“/”的其他内容?我添加了一个条件,如果扫描的格式不是number/number,它将再次调用扫描。但我不明白你到底想怎么处理这个案子。按照上述方法会导致在不匹配期间出现无限循环。我可以处理else语句,非常感谢您的帮助。当字符串格式无效时,会导致堆栈溢出。我认为这是最好的答案,我在java.util.regex.Matcher和java.util.regex.Pattern方面没有太多经验,因为本课程是针对基础java课程的。但我会读更多关于这方面的内容。谢谢我会这样做,但要使用输入的开头和结尾符号(
\\A
\\z
),而不是行的开头和结尾符号(
^
$
),因为按照您的方式,类似于
“5/5\n6/7”的字符串
也会匹配。我还建议使用命名的捕获组和数字之间的可选间距(这更像是根据您希望的可接受格式进行的判断调用),因此在我的情况下,正则表达式将变成
“\\a(?-?\\d+[]?\/[](?-?\\d+\\z)”
,使用此正则表达式,组访问变为
matcher.group(“分子”)
matcher.group(“分母”)
。如果正则表达式发生变化,只需更容易跟踪即可。酷,命名组!我不知道。用你的建议更新了我的答案,谢谢。我认为这是最好的答案。我对java.util.regex.Matcher和java.util.regex.Pattern没有太多经验,因为这个帮助是为了一门基础java课程。但我会读更多关于这方面的内容。谢谢我会这样做,但要使用输入的开头和结尾符号(
\\A
\\z
),而不是行的开头和结尾符号(
^
$
),因为按照您的方式,类似于
“5/5\n6/7”的字符串
也会匹配。我还建议使用命名的捕获组和数字之间的可选间距(这更像是根据您希望的可接受格式进行的判断调用),因此在我的情况下,正则表达式将变成
“\\a(?-?\\d+[]?\/[](?-?\\d+\\z)”
,使用此正则表达式,组访问变为
matcher.group(“分子”)
matcher.group(“分母”)
。如果正则表达式发生变化,只需更容易跟踪即可。酷,命名组!你没看见吗