2013-03-22 3 views
3


У меня есть строковое представление примитива, и моя цель - определить, какой из его примитивов.
Моя функция заключается в следующем:
Как определить тип примитива в представлении String?

public Object getPrimitive(String primitiveAsString) { 
..... 
} 

Так, например, я хотел бы возвращать целое число в случае, если вход «223», но дважды, если вход «223,1» или даже «223,0» (!!). Более того, я хотел бы разделить между float и double и даже между целым числом и «BigInteger».

Я пробовал решение, используя NumberFormat, и это не помогло мне ....

Есть ли элегантный способ сделать это?

Спасибо!

+3

Нет, нет элегантного способа об этом. –

+2

Какие примитивные типы вам нужны для поддержки? – NPE

+0

Каким образом вы можете отличить строковое представление целого числа от представления BigInteger (пока значение находится между MAX_INT и MIN_INT)? – Erik

ответ

0

Идея просто пытается вернуть каждый тип в try-catch.

код: (ошибка проверка может быть меньше, чем идеал)

public static void main(String[] args) 
{ 
    System.out.println(getPrimitive("123")); // Byte 
    System.out.println(getPrimitive("1233")); // Short 
    System.out.println(getPrimitive("1233587")); // Integer 
    System.out.println(getPrimitive("123.2")); // Float 
    System.out.println(getPrimitive("123.999999")); // Double 
    System.out.println(getPrimitive("12399999999999999999999999")); // BigInteger 
    System.out.println(getPrimitive("123.999999999999999999999999")); // BigDecimal 
} 

static public Object getPrimitive(String string) 
{ 
    try { return Byte.valueOf(string);  } catch (Exception e) { }; 
    try { return Short.valueOf(string);  } catch (Exception e) { }; 
    try { return Integer.valueOf(string); } catch (Exception e) { }; 
    try { return new BigInteger(string);  } catch (Exception e) { }; 
    try { if (string.matches(".{1,8}")) 
      return Float.valueOf(string); } catch (Exception e) { }; 
    try { if (string.matches(".{1,17}")) 
      return Double.valueOf(string); } catch (Exception e) { }; 
    try { return new BigDecimal(string);  } catch (Exception e) { }; 
    // more stuff ? 
    return null; 
} 

Смысл .{1,8} и .{1,17} является то, что float и double с точностью до примерно 7 и 16 цифр каждый (в соответствии с некоторым случайным источником). . - это дикая карточка. {x,y} означает повторение между x и y раз.

EDIT:

Улучшено дифференцировать float, double и BigDecimal с основным регулярным выражением среди других вещей.

+0

Как вы определяете число, которое принадлежит BigInteger/BigDecimal, так как Integer.parseInt() сам проверит его на целое число правильно. –

+0

@Ankur '1239999999999999999999999999' больше, чем поместится в' Integer', поэтому он попадет в 'BigInteger'. – Dukeling

+0

Что делать, если число мало? Тем не менее он может принадлежать BigInteger –

0

Сомневаюсь, что вы можете сделать это очень легко. Это будет очень сложно или почти невозможно обнаружить, если содержимое String принадлежит целому или BigInteger. Вы можете, конечно, различать int и double/float, написав регулярное выражение, чтобы определить, содержит ли он '.' и остальные символы - цифры.

0

Я бы сделал что-то вроде этого ... это должно работать и для BigInteger, и BigDecimal ... Не проверял его.

public Object getPrimitive(String primitiveAsString) { 
    String value = primitiveAsString; 

    try { 
     return Byte.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Short.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Integer.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Float.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Double.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Long.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return new BigInteger(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return new BigDecimal(value); 
    } catch (NumberFormatException ex) { } 

    if(value.length() == 1) { 
     return new Character(value.charAt(0)); 
    } 

    return null; 
} 

РЕДАКТИРОВАТЬ: улучшено решение для удовлетворения случаев, когда вход является BigInteger/BigDecimal. Это решение не использует никакого регулярного выражения.

+1

Ваш заказ неправильный, 'Byte' и' Short' никогда не будут запускаться (потому что все 'Byte' и 'Short's 'также являются' Integer'. – Dukeling

+0

, спасибо за указатель, внесли изменения. – vijay

+0

Попробуйте найти любой тестовый пример, в котором он вернет 'Double' или' BigDecimal'. 'Float', вероятно, будет охватывать все (даже если он сильно крутится). вам нужно регулярное выражение. – Dukeling

Смежные вопросы