如何将格式化字符串转换为浮点数?

时间:2012-06-05 23:48:01

标签: java number-formatting string-conversion

我有一个字符串列表,如果模式匹配,我想将它们转换为float。

以下是一些值和预期结果:

1000         -> 1000.0
1.000        -> 1000.0
1.000,000    -> 1000.0
-1.000,000   -> -1000.0
9,132        -> 9.132
1,000.00     -> invalid
30.10.2010   -> invalid
1,000.000,00 -> invalid

我尝试使用此代码检查数字是否有效,但模式永远不匹配:

Pattern pattern = Pattern.compile("#.###,###");
for(String s : list){
    Matcher m = pattern.matcher(s); 
    if(m.matches()){
         //convert
    }
}

除此之外,我尝试使用此代码:

 DecimalFormat df = (DecimalFormat) NumberFormat.getCurrencyInstance();
 for(String s : list){
        try {
            Number num = df.parse(s);
            //..
        } catch (ParseException e) {

        } 
    }

此代码的问题是,不执行基于模式的验证。例如。像2012/05/30这样的日期会转换为2012

那么我如何定义有效模式或为我的需求配置DecimalFormat

4 个答案:

答案 0 :(得分:3)

Pattern类适用于正则表达式。你可能想要这个:

Pattern pattern = Pattern.compile("-?\d\.\d{1,3}(,\d{1,3})?");

您可能希望根据您想要或不想匹配的格式来调整此正则表达式。

答案 1 :(得分:2)

我认为这就是你想要的。评论应该解释它。

@Test
public void testAllValues() {
    testValue("1000", "1000");
    testValue("1.000,000", "1000");
    testValue("-1.000,000", "-1000");
    testValue("9,132", "9.132");
    testValue("1,000.00", null);
    testValue("30.10.2010", null);
    testValue("1,000.000,00", null);
}

private void testValue(String germanString, String usString) {
    BigDecimal germanDecimal = (BigDecimal) parse(germanString);
    if (usString != null) {
        BigDecimal usDecimal = new BigDecimal(usString);
        assertEquals("German " + germanString + " did not equal US " + usString, 0, germanDecimal.compareTo(usDecimal));
    } else {
        assertEquals("German " + germanString + " should not have been pareseable", null, germanDecimal);
    }
}

public BigDecimal parse(String s) {
    // Patch because parse doesn't enforce the number of digits between the
    // grouping character (dot).
    if (!Pattern.matches("[^.]*(\\.\\d{3})*[^.]*", s)) {
        return null;
    }

    DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMANY);
    df.setParseBigDecimal(true);

    // Have to use the ParsePosition API or else it will silently stop
    // parsing even though some of the characters weren't part of the parsed
    // number.
    ParsePosition position = new ParsePosition(0);
    BigDecimal parsed = (BigDecimal) df.parse(s, position);

    // getErrorIndex() doesn't seem to accurately reflect errors, but
    // getIndex() does reflect how far we successfully parsed.
    if (position.getIndex() == s.length()) {
        return parsed;
    } else {
        return null;
    }
}

答案 2 :(得分:1)

尝试

System.out.println("1,000.000,00".matches("^[+-]?\\d+(\\.\\d{3})*(,\\d+)?"));

我不确定你的号码是否可以以+开头,所以为了以防万一而添加它。也不知道0100000.000.000,1234是否有效。如果不知道为什么和正则表达式将得到纠正。

答案 3 :(得分:0)

如果模式是逗号,请尝试:

String[] splitted = string.split(",")

如果size of splitted > 2 - >无效。

如果splitted.size == 2 && splitted[1].split(".") > 0 - >也无效。

如果格式正常 - >删除所有点,用逗号替换逗号,将逗号后的字符串解析为int并连接各个部分。

一种非常简单的方法,但它有效......