验证字符串是否匹配实数
Verify if String matches real number
我正在尝试验证字符串 match/is 是否为实数。为此,我创建了这个方法:
public static boolean Real(String s, int i) {
boolean resp = false;
//
if ( i == s.length() ) {
resp = true;
} else if ( s.charAt(i) >= '0' && s.charAt(i) <= '9' ) {
resp = Real(s, i + 1);
} else {
resp = false;
}
return resp;
}
public static boolean isReal(String s) {
return Real(s, 0);
}
但显然它只适用于整数。任何人都可以告诉我如何做到这一点吗?
P.S: 我只能使用s.charAt(int)
e length()
Java 函数。
您需要使用 Regex
。验证字符串是否包含浮点数的正则表达式是:
^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$
public static boolean isReal(String str) {
boolean real = true;
boolean sawDot = false;
char c;
for(int i = str.length() - 1; 0 <= i && real; i --) {
c = str.charAt(i);
if('-' == c || '+' == c) {
if(0 != i) {
real = false;
}
} else if('.' == c) {
if(!sawDot)
sawDot = true;
else
real = false;
} else {
if('0' > c || '9' < c)
real = false;
}
}
return real;
}
你可以尝试做这样的事情。还添加了递归解决方案。
public static void main(String[] args) {
System.out.println(isReal("123.12"));
}
public static boolean isReal(String string) {
boolean delimiterMatched = false;
char delimiter = '.';
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (!(c >= '0' && c <= '9' || c == delimiter)) {
// contains not number
return false;
}
if (c == delimiter) {
// delimiter matched twice
if (delimiterMatched) {
return false;
}
delimiterMatched = true;
}
}
// if matched delimiter once return true
return delimiterMatched;
}
递归求解
public static boolean isRealRecursive(String string) {
return isRealRecursive(string, 0, false);
}
private static boolean isRealRecursive(String string, int position, boolean delimiterMatched) {
char delimiter = '.';
if (position == string.length()) {
return delimiterMatched;
}
char c = string.charAt(position);
if (!(c >= '0' && c <= '9' || c == delimiter)) {
// contains not number
return false;
}
if (c == delimiter) {
// delimiter matched twice
if (delimiterMatched) {
return false;
}
delimiterMatched = true;
}
return isRealRecursive(string, position+1, delimiterMatched);
}
Can anybody give me a tip on how to do this?
从现有的整数递归匹配器开始,修改它并在另一种方法中使用它来匹配以下整数:
["+"|"-"]<whole-number>["."[<whole-number>]]
提示:您很可能需要将现有方法更改为 return 最后匹配的字符的索引,而不仅仅是真/假。想出在整数结果中编码 "no match" 的最佳方法。
我正在尝试验证字符串 match/is 是否为实数。为此,我创建了这个方法:
public static boolean Real(String s, int i) {
boolean resp = false;
//
if ( i == s.length() ) {
resp = true;
} else if ( s.charAt(i) >= '0' && s.charAt(i) <= '9' ) {
resp = Real(s, i + 1);
} else {
resp = false;
}
return resp;
}
public static boolean isReal(String s) {
return Real(s, 0);
}
但显然它只适用于整数。任何人都可以告诉我如何做到这一点吗?
P.S: 我只能使用s.charAt(int)
e length()
Java 函数。
您需要使用 Regex
。验证字符串是否包含浮点数的正则表达式是:
^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$
public static boolean isReal(String str) {
boolean real = true;
boolean sawDot = false;
char c;
for(int i = str.length() - 1; 0 <= i && real; i --) {
c = str.charAt(i);
if('-' == c || '+' == c) {
if(0 != i) {
real = false;
}
} else if('.' == c) {
if(!sawDot)
sawDot = true;
else
real = false;
} else {
if('0' > c || '9' < c)
real = false;
}
}
return real;
}
你可以尝试做这样的事情。还添加了递归解决方案。
public static void main(String[] args) {
System.out.println(isReal("123.12"));
}
public static boolean isReal(String string) {
boolean delimiterMatched = false;
char delimiter = '.';
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (!(c >= '0' && c <= '9' || c == delimiter)) {
// contains not number
return false;
}
if (c == delimiter) {
// delimiter matched twice
if (delimiterMatched) {
return false;
}
delimiterMatched = true;
}
}
// if matched delimiter once return true
return delimiterMatched;
}
递归求解
public static boolean isRealRecursive(String string) {
return isRealRecursive(string, 0, false);
}
private static boolean isRealRecursive(String string, int position, boolean delimiterMatched) {
char delimiter = '.';
if (position == string.length()) {
return delimiterMatched;
}
char c = string.charAt(position);
if (!(c >= '0' && c <= '9' || c == delimiter)) {
// contains not number
return false;
}
if (c == delimiter) {
// delimiter matched twice
if (delimiterMatched) {
return false;
}
delimiterMatched = true;
}
return isRealRecursive(string, position+1, delimiterMatched);
}
Can anybody give me a tip on how to do this?
从现有的整数递归匹配器开始,修改它并在另一种方法中使用它来匹配以下整数:
["+"|"-"]<whole-number>["."[<whole-number>]]
提示:您很可能需要将现有方法更改为 return 最后匹配的字符的索引,而不仅仅是真/假。想出在整数结果中编码 "no match" 的最佳方法。