2015-05-19 5 views
0

Я создаю функцию Udf для программы преобразования области в java. У меня есть следующие данные:не удалось разбить числовое значение из строки

230Sq.feet 
110Sq.yards 
8Acres 
123Sq.Ft 

Я хочу, чтобы разделить вышеуказанные данные, как это:

230 Sq.feet 
990 Sq.feet 
344 Sq.feet 
123 Sq.feet 

Я попытался следующий код:

public class Areaconversion2 extends EvalFunc<String> { 

public String determine_Area (String input) throws IOException 
{ 
    String[] AreaArr = input.split(""); 
    Double Area; 

    if(AreaArr[1].equalsIgnoreCase("Sq.Yards") || AreaArr[1].equalsIgnoreCase("Sq.Yds")) 
    { 
    Area = Double.parseDouble(AreaArr[0]); 
     Area = Area * 9; 
     String Ar = Area.toString() + " Sq.Feet"; 
     return Ar; 
    } 
else if(AreaArr[1].equalsIgnoreCase("Acre") || AreaArr[1].equalsIgnoreCase("Acres")) 
{  
     Area = Double.parseDouble(AreaArr[0]); 
     Area = Area * 43560; 
     String Ar = Area.toString() + " Sq.Feet"; 
    return Ar; 
} 
else if(AreaArr[1].equalsIgnoreCase("Sq.Feet)")||AreaArr[1].equalsIgnoreCase("Sq.Ft")); 
     { 
      Area = Double.parseDouble(AreaArr[0]); 
     String Ar = Area.toString() + " Sq.Feet"; 
      return Ar; 
     } 

    } 

public String exec(Tuple input) throws IOException { 
    // TODO Auto-generated method stub 
    if (input == null || input.size() == 0) 
     return null; 

    try 

    { 

     String str = (String)input.get(0); 

     return determine_Area(str); 
     }catch(Exception e){ 
       throw new IOException("Caught exception processing input row ", e); 
     } 
} 

} 

я получил исключение только при обработке , Любая помощь будет оценена.

+1

Исключение следа, пожалуйста? –

+0

что касается ** 8Acres ** ?? –

+0

String [] AreaArr = input.split (""); он никогда не разделит вашу строку. –

ответ

0

Вы можете использовать упреждающую/Двойник за соответствие:

String[] fields = str.split("(?<=\\d)(?=[A-Z])"); 

(?<=\\d) является нулевой длиной согласовани это означает, что «цифра должна предшествовать», и (?=[A-Z]) является нулевой длиной что означает, что «заглавная буква должна быть после строки соответствия».

Испытано на ваших данных:

public static void main(String[] args) { 
    String[] inputs = {"230Sq.feet", "110Sq.yards", "8Acres", "123Sq.Ft"}; 
    for(String input : inputs) { 
     String[] fields = input.split("(?<=\\d)(?=[A-Z])"); 
     System.out.println(fields[0]+" "+fields[1]); 
    } 
} 

Выход:

230 Sq.feet 
110 Sq.yards 
8 Acres 
123 Sq.Ft 
0

Вместо использования split() вы можете пойти за Pattern и Matcher.

public static void main(String[] args) { 
    String s = "230Sq.feet"; 
    Pattern p = Pattern.compile("(\\d+)(\\D+)"); // group 1 is the number part and group 2 is everything that follows the number part 
    Matcher m = p.matcher(s); 
    while (m.find()) { 
     System.out.println(m.group(1)); 
     System.out.println(m.group(2)); 
    } 
} 
O/P : 
230 
Sq.feet