格式字符串为bigdecimal



我正在从文本文件中解析一堆数字。

我已经从文件中隔离了数字:4711,17,该文件应该转换为BigDecimal以进行进一步处理。(请注意逗号(

,但我无法转换。我得到了parseexceptions。

public BigDecimal amount; //variable
while((line = inputStream.readLine()) != null) { //reading from file
    amount = new BigDecimal(line.substring(17,30)); //parsing out the number
}

是因为逗号还是在这里发生了什么?(我无法将其从逗号更改为点(

谢谢


输出中的第一行看起来像这样:

O5555 5555555555 4711,17 420110315SEK

您在这里有2个问题:

外部空间

您正在尝试解析以下String" 4711,17"

您需要使用String#trim

使用逗号(,(作为十进制分离器

就像解析Date S一样,货币甚至数字在某种程度上依赖于Locale。在某些(许多(国家/地区,逗号(,(用作数千个分离器,点(.(表示小数。

因此,您必须指定您正在使用的Locale,以便计算机以相同的方式解释此String(或假设默认的Locale是您想要的(。

例如,让我们使用Locale.FRANCE语言环境, do 使用,作为小数的分离器:

//                                                  ',' indicates decimals
//                                                      v           v
final NumberFormat formatter = NumberFormat.getInstance(Locale.FRANCE);
final String line = "O5555 5555555555       4711,17         420110315SEK";
final Number parsed = formatter.parse(line.substring(17, 30).trim());
//                                                          ^     ^
//                                                          trimmed

使用上面的摘要,您将留下一个Number,其值是您想要的值:(

由于您正在寻找BigDecimal,因此我只使用BigDecimal.valueOf(parsed .doubleValue())来"转换"它,例如:

final BigDecimal amount = BigDecimal.valueOf(formatter.parse(line.substring(17, 30).trim()).doubleValue());

将其纳入您的代码将提供:

BigDecimal amount;
while((line = inputStream.readLine()) != null) {
    amount = BigDecimal.valueOf(formatter.parse(line.substring(17, 30).trim()).doubleValue());
}

使用饰板从子字符串中删除空格:

String line="O5555 5555555555       4711,17         420110315SEK";
 DecimalFormatSymbols symbols = new DecimalFormatSymbols();
 symbols.setGroupingSeparator(',');
String pattern = "#,##";
DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols);
decimalFormat.setParseBigDecimal(true);
 BigDecimal amount = null;
            try {
                amount = (BigDecimal) decimalFormat.parse(line.substring(17,30).trim());
            } catch (ParseException e) {
                e.printStackTrace();
            }
            System.out.println(amount);

471117

看起来您收到的数字不是en_us locale,因为它使用逗号将小数点分开,因此您可以使用其他位置来解析。

String numStr = "O5555 5555555555       4711,17         420110315SEK".substring(17, 30).trim();
NumberFormat nf = DecimalFormat.getInstance(Locale.GERMAN);
BigDecimal bd = new BigDecimal(nf.parseObject(numStr).toString());

更多信息在这里:将特定特定字符串转换为bigdecimal

的最佳方法

最新更新