【问题标题】:Force Number to parse integer String as Double in Java强制数字在 Java 中将整数字符串解析为 Double
【发布时间】:2019-07-07 10:12:51
【问题描述】:

如何将一组数字字符串解析为通用数组?我的整个问题可以归结为以下几点:

static <T extends Number> T[] parseBulk(String bulk, Class<T> type) throws ParseException {
    NumberFormat numberFormat = NumberFormat.getInstance();
    numberFormat.setParseIntegerOnly(false);

    String[] elements = bulk.split(";");
    T[] result = (T[])Array.newInstance(type, elements.length);
    for (int i= 0; i< elements.length; i++)
        result[i] = (T)numberFormat.parse(itemElements[i]); // here it crashes
    //  result[i] = type.cast(numberFormat.parseObject(itemElements[i])); // does not work either
    return result;
}

...

Double[] shouldBeDoubles = parseBulk("15.5;10", Double.class);

看起来 Number 是通过给定 String 的内容来确定结果类型的,这会产生一个 Double 代表“15.5”,一个 Long 代表“10”。

然后它在尝试将 Long 转换为 T(即 Double)时很高兴地崩溃了。

谢谢,

更新:在源代码中添加了 numberFormat。对不起:)

【问题讨论】:

  • numberFormat有什么类型?

标签: java generics numbers


【解决方案1】:

NumberFormat.parse(String source) 返回一个Number。返回实例的运行时类型可以是Number 的任何子类,因此如果它返回Long,则不能将其强制转换为Double,如您所见。

如果你想强制将Strings 转换成数字类型,你可以将解析器Function 传递给方法:

static <T extends Number> T[] parseBulk(String bulk, Class<T> type, Function<String,T> parser) {
    String[] elements = bulk.split(";");
    T[] result = (T[])Array.newInstance(type, elements.length);
    for (int i= 0; i< elements.length; i++) {
        result[i] = parser.apply(elements[i]);
    }
    return result;
}

并调用它,例如:

Double[] shouldBeDoubles = parseBulk("15.5;10", Double.class,Double::valueOf);

这将输出:

[15.5, 10.0]

【讨论】:

  • 多么漂亮但有点丑陋的解决方案。虽然需要 Java 8 :( 我正在为较旧的 Android 编写此代码,所以不适合我。
  • @Anton 您可以在 Java 7 中编写类似的内容,但需要更多代码。您必须创建一些接口来使用而不是 Function,并且您必须使用匿名类实例而不是方法引用来实现该接口。
  • 它会变得不那么漂亮而丑陋得多。在这种情况下,我宁愿全部使用 if-else (这是目前对我有用的临时解决方案)。毕竟,Java 中没有那么多原始数字类型。无论如何谢谢。我真的很喜欢您的解决方案的美观和简单。
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多