【问题标题】:How do you determine the type of data contained in a string?如何确定字符串中包含的数据类型?
【发布时间】:2012-07-12 08:10:19
【问题描述】:

我有一个接受字符串参数的方法。

字符串可以包含整数、长整数、双精度、布尔值或只是普通的旧字符和数字。

我需要一种简单的方法来确定字符串的类型。

一种方法是拥有一堆try catch块并尝试将其解析为每种类型,如果抛出异常,则可能不是该数据类型。这似乎是错误的,因为它是一个启发式程序,而不是一个确定性程序。

【问题讨论】:

  • 你能提供一些代码吗? “字符串可以是 int”对我来说没有意义。
  • 您可能需要按照these 行做一些事情。
  • 如果输入是"1",预期的结果是什么?字节?短的?诠释?长的?双倍的?布尔值(真)?还是字符串?
  • @Mehrdad - 没有代码,但请检查我的编辑。
  • 不要这样做。 Java 不适用于此类编程。

标签: java variables


【解决方案1】:

我认为通常假设您需要知道它是什么 - 通常这些参数要么是已知的,要么带有一些元数据。您始终可以使用正则表达式来查找标记,例如数字和句号。

有用的模式:

Pattern.compile("(?:\\+|\\-)?\\d+\\.\\d+");` // Matches a double.
Pattern.compile("(?:\\+|\\-)?\\d{numberOfDigitsBeforeYouWantToCallItALong,}"); // Matches longs.
Pattern.compile("(?:\\+|\\-)?\\d{,numberOfDigitsBeforeYouWantToCallItALongMinusOne}"); // Matches ints.
Pattern.compile("true|false|t|f|yes|no|y|n"); // Matches booleans.

其他的都是字符串。

编辑:从您的编辑中,我看到您已经添加了它的使用方式,您可以使用 "(?:\\+|\\-)?\\d+" 来检测数字,如果您的目标类型是 int 或 long,则接受它并将其解析为目标类型而不是基于位数。或者您可以尝试直接解析为适当的类型并捕获Exception,因为无论如何您都知道预期的类型。

【讨论】:

  • 是的,用户输入每次都能得到我们。
  • 一个非常详尽的答案 :) 我会使用这种方法,但 MattR 提出的观点是有道理的,我想我会接受的。
【解决方案2】:

如果你知道参数后应该是什么类型应该,然后将字符串解析为该类型并捕获异常是可以的 - 这是捕获无效数据的适当使用异常(如只要你只尝试一种类型...)

【讨论】:

  • 同意。如果抛出和捕获异常的可能性很高,例如最初描述的情况,则应避免开销。但这听起来真的只是“它必须解析为 ,否则会出现错误”的情况,这正是那些 Exceptions 的用途。
【解决方案3】:

只有 3 种特殊情况:真、假和数字。只需检查字符串是否为“true”,然后检查它是否为“false”,然后使用 Double.parseDouble()(因为 long 可以放入 double 中)。如果不等于true或false,并且Double.parseDouble抛出异常,那么它只是一个字符串

【讨论】:

    【解决方案4】:

    你能使用 Scanner 类吗?

    String input = "1 fish 2 fish red fish blue fish";
    Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
    System.out.println(s.nextInt());
    System.out.println(s.nextInt());
    System.out.println(s.next());
    System.out.println(s.next());
    s.close(); 
    

    会输出

    1
    2
    Red
    Blue
    

    可能很复杂或者你想要什么

    【讨论】:

    • 他说对象是String的一个实例。我相信他想解析内容。
    • 如果你仔细阅读这个问题,你会注意到他已经知道这是一个字符串,他只需要决定它是否包含像“1”这样的数字或像“true”这样的布尔值还是常规字符串“ghgh”
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2019-09-17
    • 2012-01-05
    相关资源
    最近更新 更多