我有一个字符串列表,如果模式匹配,我想将它们转换为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
?
答案 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并连接各个部分。
一种非常简单的方法,但它有效......