当前位置: 首页 > 知识库问答 >
问题:

Java中有问题的decimalFormat.parse()

微生令雪
2023-03-14

有一个要求,如果用户输入一个数字,解析它,并do某物()。如果用户输入一个数字和字符串的混合物,那么doThingElse()

因此,我编写了如下代码:

String userInput = getWhatUserEntered();
try {
   DecimalFormat decimalFormat = (DecimalFormat)     
   NumberFormat.getNumberInstance(<LocaleHere>);
   Number number = decimalFormat.parse(userInput);
   doSomething(number);    // If I reach here, I will doSomething

   return;
}
catch(Exception e)  {
  // Oh.. user has entered mixture of alpha and number
}

doSomethingElse(userInput);  // If I reach here, I will doSomethingElse
return;

函数getWhatUserEntered()如下所示

String getWhatUserEntered()
{
  return "1923";
  //return "Oh God 1923";
  //return "1923 Oh God";
}

但是,有一个问题。

  • 当用户进入1923年--

我想实现的东西有什么内在的(更好的)功能吗?我的代码可以修改以适应需要吗?

共有3个答案

柴良哲
2023-03-14

DecimalFormat接受任何以数字开头的字符串。

你能做的是执行一个额外的检查。

try {
  DecimalFormat decimalFormat = (DecimalFormat)     
  NumberFormat.getNumberInstance(<LocaleHere>);
  Number number = decimalFormat.parse(userInput);
  if (number.toString().equals(userInput)) {
    doSomething(number);    // If I reach here, I will doSomething   
    return;
  }
}
许俊晤
2023-03-14

你最好使用一些正则表达式,例如userInput。匹配(“[0-9]”仅适用于匹配的数字

平元明
2023-03-14

由于特定的DecimalFormat实现,一切正常。JavaDoc说:

从给定字符串的开头解析文本以生成数字。该方法不能使用给定字符串的整个文本。

因此,您必须将代码修改为以下内容:

  String userInput = getWhatUserEntered();
    try {
        NumberFormat formatter = NumberFormat.getInstance();
        ParsePosition position = new ParsePosition(0);
        Number number = formatter.parse(userInput, position);
        if (position.getIndex() != userInput.length())
            throw new ParseException("failed to parse entire string: " + userInput, position.getIndex());
        doSomething(number);    // If I reach here, I will doSomething

        return;
    }
    catch(Exception e)  {
        // Oh.. user has entered mixture of alpha and number
    }

    doSomethingElse(userInput);  // If I reach here, I will doSomethingElse
    return;
 类似资料:
  • 我马上要考试了,其中一个题目是:< br >抽象数据类型:队列、队列、堆栈、树 我的问题是:什么是树?由于它不是一个界面,就像其他3个一样,您认为“树”是什么意思?是关于“树群”和“树状图”的共同点吗? 如果有人能帮我,我会非常感激的...

  • 问题内容: 我有以下几行代码。 这是一个奇怪的问题。如果我从路径中没有空格(文件夹名称)的路径运行它,则它运行良好。但是,如果路径包含任何空格(“ c:\ New Foler …”行),则该路径不起作用。 如何解决呢? 编辑:更详细-我检查了sysloader对象。 sysloader-> UCP->路径 正在使用字符%20而不是空格的路径 因此,所有URL均为空。 如何解决呢? 问题答案: Su

  • 问题内容: 我有下表: 我要插入数据,如下所示: 但是,当我检索数据时,它们类似于。 有什么问题,我该如何解决? 问题答案: 根据MySQL JDBC驱动程序文档,您还需要在JDBC连接URL中设置字符编码。这是一个例子: 否则,MySQL JDBC驱动程序将使用平台默认编码在通过网络发送之前将字符转换为字节,在您的情况下显然不是UTF-8。然后,所有未发现的字符将被问号替换。 另外,在检索数据时

  • 我遇到了一个家庭作业的麻烦,创建一个调用另一个类的方法的类。给我们下一课: 然后给出以下提示: 实现一个类Portfolio。这个类有两个对象,checking和savings,类型为BankAccount。实现四种方法: 公用无效存款(双倍金额,字符串帐户) 公开无效提取(双倍金额,字符串帐户) 公有作废转账(双倍金额,字符串账户) 公共双getBalance(字符串帐户) 这里的帐户字符串是“

  • 问题内容: 我正在学习Java的死锁,并且有来自Sun官方教程的以下示例代码: 阿方斯(Alphonse)和加斯顿(Gaston)是朋友,也是礼貌的忠实信徒。严格的礼貌规则是当您向朋友鞠躬时,您必须保持鞠躬,直到您的朋友有机会归还弓箭为止。不幸的是,该规则不能解决两个朋友可能同时鞠躬的可能性。 这是Sun的解释: 死锁运行时,两个线程极有可能在尝试调用bowBack时阻塞。两个块都不会结束,因为每

  • 问题内容: 我正在使用org.apache.commons.net.ftp.FTPClient,看到的行为令人困惑。 下面的方法打算浏览一个FTPFile列表,读入它们,然后对内容进行一些处理。都可以了 (真正)不起作用的是FTPClient对象执行以下操作… 有没有人看到这样的东西?我是FTPClient的新手,我在做错什么吗? 问题答案: 根据该API ,该方法返回时,它无法打开数据连接,在这