将字符串格式化为BigDecimal

时间:2018-04-27 14:56:56

标签: java

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

我已从文件中隔离了数字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

3 个答案:

答案 0 :(得分:0)

使用trim删除子字符串中的空格:

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

答案 1 :(得分:0)

这里有2个问题:

无关的空格

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

您需要修剪以使用String#trim删除前导和尾随空白字符。

使用逗号(,)作为小数点分隔符

就像解析Date一样,货币甚至数字都有点依赖Locale。在某些(许多)国家/地区,逗号(,)用作千位分隔符,而点(.)表示小数。

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

例如,让我们使用Locale.FRANCE区域设置, 使用,作为小数点的分隔符:

//                                                  ',' 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());
}

答案 2 :(得分:0)

看起来您收到的号码不是en_US语言环境,因为它使用逗号分隔小数部分,因此您可以使用不同的语言环境来解析它。

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());

此处有更多信息:Best way to convert Locale specific String to BigDecimal