【问题标题】:verifying if a string is a number [duplicate]验证字符串是否为数字 [重复]
【发布时间】:2018-03-22 20:06:24
【问题描述】:

我想用这个方法把一个字符串解析成十进制

 try {                
       Double.parseDouble(str);
    } catch (Exception exception) {
       exception.printStackTrace();                
    }

如果我在 EditText 中输入任何字母或数字后跟一个字母(到目前为止一切顺利),它会引发异常,但是当我输入一个数字后跟字母 d 或 f(例如 2.1 或 2.1f)时,它不会抛出异常。该方法将 2.1d 字符串或 2.1f 字符串视为 2.1float 或 2.1double 并将双精度值返回为 2.1d 或 2.1f 并且程序崩溃。 我还尝试使用以下方法解析字符串:

NumberFormat.getInstance().parse(str);

Double.valueOf(str);

 Double doubleObject = new Double(str);
 double number = doubleObject.doubleValue();

StringUtils.isNumeric(str);

结果是一样的。

最后我用if(str.contains(d)||str.contains(f))throw new Exception(...)做到了

是否有其他方法或其他方法可以在不使用 if 的情况下执行此操作。

【问题讨论】:

  • 听起来像是正则表达式的工作!
  • 如果您只想输入数字,请在 xml 中添加输入类型为数字
  • 可能不是很整齐,但如果只是这2个字母有问题,那么利用替换功能将'f'和'd'替换为“”

标签: java android


【解决方案1】:

如果我是你,我会这样做。

Double numberVar = Double.parseDouble(yourEditText.getText().toString());

if(new Double(numberVar) istanceof Double){
    return true;
}

非常干净,仅仅因为字符串包含 0 或 1 或任何其他数字并不意味着它不包含 a 或 I。

【讨论】:

    【解决方案2】:

    你应该使用 Long 来解析一个数字。因为 Double 是一个浮点数,它不会抛出浮点值异常,并且 d 表示 Double 中的值,所以它仍然不会抛出异常。您应该为此使用 Long。

    像这样

    Long.parseLong(str);
    

    但它仍然会接受 l 与否。那么你可以在解析之前添加一个 if 条件

    if(!str.contains("l"))
    {
        Long.parseLong(str);
    }
    else
    {
        // it is not a number.
    }
    

    另一种解决方案是将 inputType 放入 EditText

    android:inputType="numberDecimal"
    

    希望它对你有用。

    【讨论】:

    • "example 2.1or 2.1f" ...你想用 Long 解析它吗?
    • 如果你想检查十进制数,那么不要使用 Long,double 有好处。但你应该使用 inputType="numberDecimal" 而不是这个逻辑。这肯定会奏效。
    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多