Java:有没有办法知道字符串中原始数据的类型

时间:2016-02-26 12:19:56

标签: java

我有一个相同原始类型的字符串数组(不知道是什么)。我需要将其转换为相应的类型。有没有办法,如果我传递一个字符串,并获得该字符串中的数据的原始类型。考虑字符串应该具有基本类型或者它被视为字符串

对于e-g

"5.2" - double
"5" - int (most related)
"s" - char 

因此,如果它是double,我可以使用Double.parseDouble

进行解析

3 个答案:

答案 0 :(得分:5)

不,那是不可能的。例如,这个输入:

5
  • 这可能是 int
  • 但它也可能是字节
  • 它也可以是 float double
  • 它甚至可以是 char

我们唯一知道的是,它可能不是布尔

您当然也可以尝试解析您的字符串:

public static void main(String[] args) {
    checkType("5.2");
    checkType("5");
    checkType("s");
}

protected static void checkType(String input) {
    System.out.println(input);
    try {
        byte result = Byte.parseByte(input);
        System.out.println("could be interpreted as byte "+result);
    } catch (NumberFormatException e) {
        System.out.println("not an byte");
    }
    try {
        short result = Short.parseShort(input);
        System.out.println("could be interpreted as short "+result);
    } catch (NumberFormatException e) {
        System.out.println("not an short");
    }
    try {
        int result = Integer.parseInt(input);
        System.out.println("could be interpreted as int "+result);
    } catch (NumberFormatException e) {
        System.out.println("not an int");
    }
    try {
        long result = Long.parseLong(input);
        System.out.println("could be interpreted as long "+result);
    } catch (NumberFormatException e) {
        System.out.println("not an long");
    }
    try {
        float result = Float.parseFloat(input);
        System.out.println("could be interpreted as float "+result);
    } catch (NumberFormatException e) {
        System.out.println("not an float");
    }
    try {
        double result = Double.parseDouble(input);
        System.out.println("could be interpreted as double "+result);
    } catch (NumberFormatException e) {
        System.out.println("not an double");
    }
    try {
        boolean result = Boolean.parseBoolean(input);
        System.out.println("could be interpreted as boolean "+result);
    } catch (NumberFormatException e) {
        System.out.println("not a boolean");
    }
    if (input.length() == 1) {
        System.out.println("could be interpreted as character "+input);
    } else {
        System.out.println("not a character");
    }
    System.out.println();
}

对于给定的示例,它输出:

5.2
not an byte
not an short
not an int
not an long
could be interpreted as float 5.2
could be interpreted as double 5.2
could be interpreted as boolean false
not a character

5
could be interpreted as byte 5
could be interpreted as short 5
could be interpreted as int 5
could be interpreted as long 5
could be interpreted as float 5.0
could be interpreted as double 5.0
could be interpreted as boolean false
could be interpreted as character 5

s
not an byte
not an short
not an int
not an long
not an float
not an double
could be interpreted as boolean false
could be interpreted as character s

答案 1 :(得分:2)

您无法自动猜测String的内容,但如果您有一组规则,则可以创建一种解析内容的方法。

编写一个Identifier类,可以识别String的类型,然后调用关联的解析器来检索原始值。

以下是一小组符合您问题的正则表达式:

  • double =正则表达式:^[0-9]+\.[0-9]+$,解析器:Double.parseDouble(String)
  • int =正则表达式:^[0-9]+$,解析器:Integer.parseInt(String)
  • char =正则表达式:^[a-zA-Z]$,解析器:value.charAt(0)

旁注:这套正则表达式不处理负值。另外,在使用NumberFormatExceptionparseInt时,请不要忘记检查parseDouble

答案 2 :(得分:0)

Java字符串是字符的抽象,只看到字符。

String本身不知道它内部是什么类型的表示,除了它是所有字符集的同类(独占)。

如果你被" +"误导运营商。此运算符会将您连接的内容压缩为对象,并且当对象连接时,它将转换为字符串,因此您的数据确实会丢失。

您需要自己分析字符串,以确定它是否包含对您有意义的信息并将其解压缩。

可以创建自己的能够存储此类信息的字符串,但它会使构造膨胀,因为您很少需要使用这些功能,并且它们也可以在外部使用。

发布您想要完成的内容而不是抽象的可能性声明会更有帮助。答案是肯定的,你可以这样做,但字符串对你没有帮助,你需要自己解析字符串。

参见" http://asciivalue.com/"看到你输入的任何字符串基本上几乎完全隐藏了这些数据(通常也是一个终止0)。如果它必须存储您在问题中询问的数据,那么存储起来就太昂贵了。