标题几乎说明了一切......
我正在尝试在表单上强制执行文本输入的最大长度。其中一个字段可以是任何有效的浮点数。它的最大长度是多少?
例如,对于整数
// negative sign makes MIN_VALUE larger than MAX_VALUE
String.valueOf(Integer.MIN_VALUE).length();
更新
我测试了以下内容:
String.valueOf(-Float.MIN_VALUE).length();
String.valueOf(-Float.MAX_VALUE).length();
String.valueOf( Float.MIN_VALUE).length();
String.valueOf( Float.MAX_VALUE).length();
这给了我以下输出:
8
13
7
12
我不相信13是最大长度
答案 0 :(得分:4)
浮点值的最大长度没有意义。
如果您希望用户输入java所表示的任何浮点值,您需要允许类似
的内容1000000000000000000000000000000000000000000000000000000000000000
甚至
000000000000000000000000000000000000000000000000000000000.00000000000000000000001
输入字段的限制应基于业务需求,而不是“我对所有其他字段都有限制”等规则。
到目前为止,“业务”规则似乎是“可以解析并存储到浮点数”
另请注意,限制输入长度通常会阻止输入(通过剪切和粘贴)更长的内容,并且仅在某些编辑后才成为有效输入。所以它实际上降低了可用性。
答案 1 :(得分:1)
可以通过简单地测试随机值来提供反例,直到找到稳定的最大值。这种方法可能存在的问题是,只能找到局部最大值,并且没有详尽的全局最大值。
这台电脑上的结果是:
Max. float length: 15 (-1.09045365E-32)
这是您-Float.MAX_VALUE
的反例。
有时知道Float.toString()
的最大长度是有用的,在这种情况下可以回答这个问题。
public class FindMaxStringForPrimitive {
private static final int MAX_PERIOD = 10000; // Number of iterations before
// concluding answer
public static void main(String... args) {
maxFloatLength();
}
private static void maxFloatLength() {
final class Test {
int r = Integer.MIN_VALUE;
Random rnd = new Random();
String max = "";
boolean fit() {
return fit(Float.intBitsToFloat(rnd.nextInt()));
}
boolean fit(float value) {
String x = Float.toString(value);
if (x.length() > r) {
r = x.length();
max = x;
return true;
}
return false;
}
}
Test test = new Test();
int i = 0;
test.fit(Float.MAX_VALUE);
test.fit(-Float.MAX_VALUE);
test.fit(Float.MIN_VALUE);
test.fit(-Float.MIN_VALUE);
test.fit(Float.NaN);
test.fit(Float.POSITIVE_INFINITY);
test.fit(Float.NEGATIVE_INFINITY);
while (i < MAX_PERIOD)
if (test.fit()) i = 0;
else
i++;
System.out.println("Max. float length: " + test.r + " (" + test.max + ")");
}
}