信件被接受为双

时间:2014-03-16 23:19:56

标签: java swing

我有一个txtbox,你把你的收入'进入然后转换并检查以查看您的税收等。(只是一个简单的税收计算器)

它不允许任何字母/特殊字符等......

虽然当我输入' 123456d' ' 123456f' 时会计算,但忽略了端。

使用字母 D F

我只想知道如何解决这个问题或者为什么会这样?

3 个答案:

答案 0 :(得分:3)

浮动或双重文字最后允许包含f F dD字符,因为它们是文字的一部分(并用于表达变量的确切类型:floatdouble)。

可以看到Java用于将字符串解析为浮点值的方法here。你可以看到:

    if ( i < l &&
            ((i != l - 1) ||
            (in.charAt(i) != 'f' &&
             in.charAt(i) != 'F' &&
             in.charAt(i) != 'd' &&
             in.charAt(i) != 'D'))) {
            break parseNumber; // go throw exception
        }

要解决您的问题,您需要以不同的方式解析数字,检查字符串是否以其中一个字符结尾并在实际扫描之前阻止它。

答案 1 :(得分:1)

implementation of Double.parseDouble()是:

public static double parseDouble(String s) throws NumberFormatException {
    return FloatingDecimal.readJavaFormatString(s).doubleValue();
}

FloatingDecimal是一个内部类,来源是here。查看来源,您会看到后缀'D','d','F'和'f'被接受但被忽略(第1233-1236行)。

这可能存在,因此字符串格式与Java语法which allows D/F suffixes on literals一致以指定类型。正如Radiodef在评论中指出的那样,Double.valueOf()记录了它。特别是:

  

请注意,尾随格式说明符,用于确定浮点文字类型的说明符(1.0f是浮点值; 1.0d是double值),不会影响此方法的结果。

在正则表达式中:[fFdD]?

如果您需要明确禁止这些类型的字符串,解决方法是确保输入字符串不以D / d / F / f结尾,然后再将其解析为double。

答案 2 :(得分:0)

如果你想确保输入数据只是nummeric(或。,那么你需要检查每个字符的有效性。听起来像家庭作业,所以没有代码。

您可以通过考虑状态图来检查有效性:

  1. 在任何小数点之前..仅接受数字并保持在状态1 如果十进制接受并移至状态2
  2. 如果是数字且不超过2位

    ...