使用NumberFormat格式化数字时报Cannot format given Object as a Number错误如何解决
错误原因
你代码中抛出Cannot format given Object as a Number异常的直接原因是:
NumberFormat的format方法仅支持接收Number类型的入参(比如Long、Double、Integer等),但你在调用时传入了Long.toString()生成的字符串类型值,类型不匹配触发异常。- 额外潜在问题:如果你从
paramValue节点拿到的原始值就是1 000 048,35这种带空格千位分隔符、逗号做小数分隔符的斯洛伐克格式字符串,直接调用Long.parseLong()也会解析失败,该方法无法识别格式字符。
修正方案
场景1:paramValue返回纯数字字符串(比如100004835,需除以100后格式化)
直接删除Long.toString()调用,将数值计算结果直接传给format即可:
Document document = convertStringToDocument(response.getBody()); String error = Objects.requireNonNull(document).getElementsByTagName("status").item(0).getTextContent(); NumberFormat nf = NumberFormat.getInstance(new Locale("sk", "SK")); long originalNum = Long.parseLong(Objects.requireNonNull(document) .getElementsByTagName("paramValue").item(0).getTextContent()); // 直接传入Long类型参数,不需要转String String value = nf.format(originalNum / 100); List<ValueItem> valueItems = new LinkedList<>(); ValueItem balance = new ValueItem(); balance.setKey("balance"); balance.setName("Баланс"); balance.setValue(value); valueItems.add(balance); additionalSuppliersReturn.setValueItems(valueItems);
场景2:paramValue返回带格式的字符串(比如1 000 048,35)
需要先用对应Locale的NumberFormat先解析原始字符串为数值,再做后续处理:
Document document = convertStringToDocument(response.getBody()); String error = Objects.requireNonNull(document).getElementsByTagName("status").item(0).getTextContent(); NumberFormat nf = NumberFormat.getInstance(new Locale("sk", "SK")); String rawValue = Objects.requireNonNull(document) .getElementsByTagName("paramValue").item(0).getTextContent(); // 先解析带格式的字符串为数值 Number parsedNum = nf.parse(rawValue); long calculatedNum = parsedNum.longValue() / 100; String value = nf.format(calculatedNum); List<ValueItem> valueItems = new LinkedList<>(); ValueItem balance = new ValueItem(); balance.setKey("balance"); balance.setName("Баланс"); balance.setValue(value); valueItems.add(balance); additionalSuppliersReturn.setValueItems(valueItems);
内容的提问来源于stack exchange,提问作者shoxrux sindarov
相关产品推荐
相关产品推荐

