Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串转换为适当的数据类型_Java_String_Date - Fatal编程技术网

Java 将字符串转换为适当的数据类型

Java 将字符串转换为适当的数据类型,java,string,date,Java,String,Date,我有一个字符串,它可以有许多不同的格式。我需要能够在运行时识别值的实际类型,然后将值转换为该类型 比如说。如果我有一个字符串Fri Feb 08 07:30:00 GMT 2013这实际上是一个日期和一个字符串应转换为日期对象,并返回 我目前对此问题的解决方案是“尝试”将其转换为数据类型,如果转换成功,则一切正常;如果转换失败,则继续进行下一次转换尝试。这是可行的,但是很难看而且不可维护,我相信已经有了更好的解决方案 谢谢。试试正则表达式: 您可以为您拥有的每个数据类型编写一个模式,然后将该模式

我有一个
字符串
,它可以有许多不同的
格式
。我需要能够在
运行时识别值的实际类型,然后将值转换为该类型

比如说。如果我有一个
字符串
Fri Feb 08 07:30:00 GMT 2013
这实际上是一个
日期
和一个
字符串
应转换为
日期对象
,并返回

我目前对此问题的解决方案是“尝试”将其转换为数据类型,如果转换成功,则一切正常;如果转换失败,则继续进行下一次转换尝试。这是可行的,但是很难看而且不可维护,我相信已经有了更好的解决方案

谢谢。

试试正则表达式: 您可以为您拥有的每个数据类型编写一个模式,然后将该模式与您可以为每个匹配关联转换的每个实际字符串相匹配。 下面是一个简单的示例(使用伪Java):

有关匹配器和正则表达式的更多详细信息,请查阅java文档:

您可以对每种数据类型使用单独的正则表达式,如下所示:

private final static Pattern DATE_PATTERN = 
    Pattern.compile (
        "(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat) " + 
        "(?:Jan|Feb|Mar|Apr|May|June?|July?|Aug|Sept?|Oct|Nov|Dec) " + 
        "\\d\\d \\d\\d:\\d\\d:\\d\\d \\S+ \\d\\d\\d\\d");

private final static Pattern DOUBLE_PATTERN = 
    Pattern.compile (
        "[\\+\\-]?\\d+\\.\\d+(?:[eE][\\+\\-]?\\d+)?");

private final static Pattern INTEGER_PATTERN = 
    Pattern.compile (
        "[\\+\\-]?\\d+");

public static Object stringToObject (String string)
{
    if (DATE_PATTERN.matcher (string).matches ())
        return stringToDate (string);
    else if (DOUBLE_PATTERN.matcher (string).matches ())
        return Double.valueOf (string);
    else if (INTEGER_PATTERN.matcher (string).matches ())
        return Integer.valueOf (string);
    else return string;
}

如果传递给您的字符串超出了您的控制范围,那么您的方法很好。还有一个建议:您应该应用所有可能的转换并检查不明确的字符串。如果多次转换成功,则字符串不明确,您应该进行一些错误处理,可能会引发异常。

字符串可以转换为哪些可能的数据类型?您希望如何区分“0”表示“真的,我希望字符串只包含0”和“0”表示“整数0”和“0”意思是“双倍值0”和“0”意思是“十进制值0”?如果您可以尝试在值旁边保留适当的类型信息,那会更好。您可以显示一些其他示例字符串吗?这些字符串是
toString()
method的输出吗?@anubhava布尔值、日期、字符串和数字值最常用part@MeNoMore我不认为它是重复的-在这个问题中,类型是String,因此您不能强制转换为其他类型。
public static void main(String[] args) {

    String s = "Fri Feb 08 07:30:00 GMT 2013";
    SimpleDateFormat FT = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy");
    Date d;
    try {
        d = FT.parse(s);
        System.out.println(d);
    } catch (ParseException ex) {
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    }
}
private final static Pattern DATE_PATTERN = 
    Pattern.compile (
        "(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat) " + 
        "(?:Jan|Feb|Mar|Apr|May|June?|July?|Aug|Sept?|Oct|Nov|Dec) " + 
        "\\d\\d \\d\\d:\\d\\d:\\d\\d \\S+ \\d\\d\\d\\d");

private final static Pattern DOUBLE_PATTERN = 
    Pattern.compile (
        "[\\+\\-]?\\d+\\.\\d+(?:[eE][\\+\\-]?\\d+)?");

private final static Pattern INTEGER_PATTERN = 
    Pattern.compile (
        "[\\+\\-]?\\d+");

public static Object stringToObject (String string)
{
    if (DATE_PATTERN.matcher (string).matches ())
        return stringToDate (string);
    else if (DOUBLE_PATTERN.matcher (string).matches ())
        return Double.valueOf (string);
    else if (INTEGER_PATTERN.matcher (string).matches ())
        return Integer.valueOf (string);
    else return string;
}