【问题标题】:Java automatic Type Casting of any String任何字符串的 Java 自动类型转换
【发布时间】:2014-07-22 13:24:53
【问题描述】:

有没有办法将任何 String 自动转换为 Java 中的原始数据类型?例如有一个包含 10 个字符串的列表:

string1 = "1234"
string2 = "12.34"
string3 = "String"
string4 = "0.53"
...

我想将它们全部交给一个方法,然后将值转换为正确的数据类型(浮点数、整数、字符串):

int1 = 1234
float1 = 12.34
string1 = "String"
float2 = 0.53
...

【问题讨论】:

  • 简要介绍一下?不......你必须实现它。
  • 没有。没有类似的东西是内置的。你可以写一些接近它的东西,但它会是丑陋的、hack-y 和脆弱的。
  • 这是为了某种序列化吗?如果是这样,那么在 Java 中有更好的方法来做到这一点。
  • 写完函数后,它的返回类型是什么?
  • 这实际上是一个不好的坏习惯,因为在转换时可能有多个可能的类型,您应该只在确定结果类型应该是通用实现时才选择解析对我来说没有意义。

标签: java casting type-conversion


【解决方案1】:

通过RegEx

轻松实现
String string = "/**Place your value*/";
if (string.matches("\\d+")) {
 int i = Integer.parseInt(string); 
} else if (string.matches("^([+-]?\\d*\\.?\\d*)$)")) {
 float f = Float.parseFloat(string); 
}

以同样的方式,你可以解析 double、long、....

【讨论】:

  • 您希望如何使用这种技术将浮点数与 int 与仅包含数字等的字符串区分开来?
  • 通过使用正则表达式,我们可以找到它的长度或大小,无论我们想要什么。来吧,伙计... ;)
  • “加油吧”很难回答这个问题。长度和大小(有什么区别?)都不会告诉您它是字符串、整数还是浮点值。
  • 强制转换仅适用于您确定结果类型是什么的情况,通用黑客只会在模棱两可的情况下支持特定情况。 Java 没有内置这样的 hack 是有原因的。
  • *因为它显然会藐视 Java 的“强类型”范式。
【解决方案2】:

没有办法做到这一点。您可以使用 instanceof 测试对象的类

Object integerValue = 1234;
    Object doubleValue = 12.34;
    Object array = new String[] { "This", "is", "a", "Stringarray" };
    if (integerValue instanceof Integer) {
        System.out.println("it's an Integer! Classname: " + integerValue.getClass().getName()); // will be printed
    }
    if (doubleValue instanceof Double) {
        System.out.println("this one is a Double *___* Classname: " + doubleValue.getClass().getName()); // will be printed
    }
    if (array instanceof String) {
        System.out.println("Is it a String?");
    } else if (array instanceof String[]) {
        System.out.println("It's a Stringarray :O! Classname: " + array.getClass().getName()); // will be printed
    } else {
        System.out.println("Huh? Something went wrong here :D");
    }

【讨论】:

  • OP 询问如何将 String 转换为其他类型 - 而不是如何区分 Object 类型。
  • 我说“没有办法做到这一点”!!!您可能知道,您可以通过其名称获取一个类。 Class.forName(className);你必须给出完整的包路径而不是它的名字,这样你才能得到它的类。您想将 String 转换/转换为另一个对象吗?所以你必须用字符串的值创建一个目标类的新实例。这就是你的做法
  • 可悲的是,Basti,不,这不是你这样做的方式 - 因为你的解决方案有 Objects 作为输入,并且 OP 明确声明 String 是输入 - 你 不能通过使用instanceof来区分String里面有什么,你也不能通过将String转换为Object来做到这一点,因为底层实例仍然是String。我知道您是 SO 新手 - 请不要使用多个感叹号,而是尝试了解在解决之前突出显示给您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多