Как преобразовать строку в целочисленное, двойное, логическое (та же сигнатура)? - PullRequest
0 голосов
/ 01 марта 2020

Можно ли преобразовать строку таким образом? У нас один и тот же параматер, и Java делает правильный выбор. Если значение является целым числом - мы вызываем parseInt (значение), иначе, если значение является двойным - мы вызываем parseDouble (значение) или значение является логическим - мы вызываем parseBoolean (значение);

public int parseInt(String value) {
    int newValue = Integer.valueOf(value).intValue();
    return newValue;    
}

public double parseDouble(String value) {
    double newValue = Double.valueOf(value).doubleValue();
    return newValue;
}

public boolean parseBoolean(String value) {
    boolean newValue = Boolean.valueOf(value).booleanValue();
    return newValue;
}


public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    ConvertStrings convert = new ConvertStrings();   
    System.out.println("Enter the value:");
    String value = sc.next();

    //If value is an Integer - we call parseInt(value);
    //If value is an double - we call parseDouble(value);
    //If value is an boolean - we call parseBoolean(value);

    sc.close();

}

Ответы [ 3 ]

1 голос
/ 01 марта 2020

Сканер имеет действительно полезные методы именно для этого, такие как hasNextInt (), hasNextLong (), hasNextBoolean (). Так что вы можете использовать их :).

Scanner scanner = new Scanner(System.in);

if (scanner.hasNextBoolean()) {
    boolean nextBoolean = scanner.nextBoolean();
} else if (scanner.hasNextInt()) {
    boolean nextInt = scanner.nextInt();
}
0 голосов
/ 02 марта 2020

Как вы знаете, между Integer.valueOf () и Integer.parseInt () есть небольшая разница. Хотя это не слишком важно, поскольку Автобокс был представлен в Java 1.5, его все же стоит отметить по конкретным c причинам , описанным здесь . В конце концов, метод Integer.valueOf () в любом случае использует метод Integer.parseInt () в своем коде метода. Другие хорошие чтения по этому поводу можно найти в этом SO Post и в этом SO Post .

Я не знаю, какую версию Java вы кодируются с помощью распаковки , используемой в:

Integer.valueOf (значение) .intValue () ;

не требуется.

Поскольку ваши методы возвращают тип данных примитив , я бы использовал .parse Xxx .. () , методы типа из класса Integer вместо метода valueOf () , если, конечно, вы не хотите воспользоваться механизмом кэширования, доступным в методе valueOf () :

 public int parseInt(String value) {
     int newValue = Integer.parseInt(value);
    return newValue;    
}

Но я бы сделал еще один шаг и подтвердил бы тот факт, что предоставленный строковый аргумент через параметр value действительно был числовым значением. Даже если вы обычно делаете это перед вызовом метода, такого как parseInt () , я не думаю, что больно иметь его на тот случай, если предварительная проверка не была выполнена. Я бы использовал для этого метод String # matchs () вместе с Regular Expression (RegEx), например:

public int parseInt(String value) {
    // Does value contain a signed or unsigned Integer 
    // type string numerical value?
    if (!value.matches("-?\\d+")) {
        //No - Throw an Exception.
        throw new IllegalArgumentException(this.getClass().getName()
                + ".parseInt() - Invalid numerical value supplied (" + value + ")!");
    }

    // Yes - Convert numerical string to a primitive int value.
    int newValue = Integer.parseInt(value);
    return newValue;
}

Со временем у вас может оказаться, что использование методов класса Integer напрямую, а не через еще один метод будет проще и выгоднее. Это, конечно, будет полностью зависеть от того, что вы делаете.

Для ваших методов вы можете попробовать это:

public int parseInt(String value) {
    if (!value.matches("-?\\d+")) {
        throw new IllegalArgumentException(this.getClass().getName()
                + ".parseInt() - Invalid numerical value supplied (" + value + ")!");
    }
    int newValue = Integer.parseInt(value);
    return newValue;
}

public double parseDouble(String value) {
    if (!value.matches("-?\\d+(\\.\\d+)?")) {
        throw new IllegalArgumentException(this.getClass().getName()
                + ".parseDouble() - Invalid numerical value supplied (" + value + ")!");
    }
    double newValue = Double.parseDouble(value);
    return newValue;
}

public float parseFloat(String value) {
    if (!value.matches("-?\\d+(\\.\\d+)?")) {
        throw new IllegalArgumentException(this.getClass().getName()
                + ".parseFloat() - Invalid numerical value supplied (" + value + ")!");
    }
    float newValue = Float.parseFloat(value);
    return newValue;
}

public boolean parseBoolean(String value) {
    value = value.toLowerCase();
    boolean newValue = false;
    if (value.matches("true")
            || value.matches("false")
            || value.matches("yes")
            || value.matches("no")) {
        if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes")) {
            newValue = true;
        }
    }
    return newValue;
}

Чтобы использовать эти методы, вы можете сделать что-то вроде этого:

Scanner sc = new Scanner(System.in);
//ConvertStrings convert = new ConvertStrings(); // Don't know what this class does.
String ls = System.lineSeparator();
int aINT;
double aDOUBLE;
float aFLOAT;
boolean aBOOLEAN;

String value = "";

while (!value.equals("q")) {
    System.out.print("Enter a value (q to quit): --> ");
    value = sc.nextLine();
    if (value.equalsIgnoreCase("q")) {
        break;
    }
    if (value.equals("")) {
        System.out.println(">> Invalid Entry! You must enter a String! <<" + ls);
        continue;
    }

    if (value.matches("-?\\d+")) {
        aINT = parseInt(value);
        System.out.println("A Integer (int) value of " + aINT + " was supplied." + ls);
    }
    else if (value.matches("-?\\d+(\\.\\d+)?([df])?")) {
        if (value.matches("-?\\d+(\\.\\d+)?d")) {
            aDOUBLE = parseDouble(value.toLowerCase().replace("d", ""));
            System.out.println("A Double (double) value of " + aDOUBLE + " was supplied." + ls);
        }
        else if (value.matches("-?\\d+(\\.\\d+)?f")) {
            aFLOAT = parseFloat(value.toLowerCase().replace("f", ""));
            System.out.println("A Float (float) value of " + aFLOAT + " was supplied." + ls);
        }
        else {
            aDOUBLE = parseDouble(value);
            System.out.println("A Double/Float (double/float) value of " + aDOUBLE + " was supplied." + ls);
        }
    }
    else if (value.toLowerCase().matches("true")
            || value.toLowerCase().matches("yes")
            || value.toLowerCase().matches("false")
            || value.toLowerCase().matches("no")) {
        aBOOLEAN = parseBoolean(value);
        System.out.println("A Boolean (boolean) value of '" + aBOOLEAN + "' was supplied." + ls);
    }
    else {
        System.out.println("A String was supplied! (\"" + value + "\")" + ls);
    }
}

В приведенном выше примере кода могут быть указаны следующие строковые значения:

  • Строка любого размера, которая в конечном итоге вернет и отобразит эту строку, если она не является числовым значением.
  • Строковое представление числового значения со знаком типа Integer со знаком или без знака.
  • Строковое представление числового значения типа Double / Float со знаком или без знака.
  • Строковое представление числовое значение типа Double со знаком или без знака, за которым следует обозначение 'd', например: "453.665d" или "3236d".
  • Строковое представление числового значения со знаком или без знака, за которым следует 'f 'обозначение, например: "127.33f" или 32f.
  • Строковое представление значения логического типа, например: "true" или "yes" или "false" или "no".

Регулярные выражения, используемые в коде:

Метод parseInt () :

if (!value.matches("-?\\d+")) {

Целочисленное значение. Если строка, содержащаяся в переменной , значение соответствует значению целого числового типа со знаком или без знака, содержащего одну или несколько цифр.


parseDouble () и parseFloat () методы:

if (!value.matches("-?\\d+(\\.\\d+)?")) {

Значение типа Double или Float. Если строка, содержащаяся в переменной , значение соответствует числовому значению со знаком или без знака типа Integer или Double / Float, содержащему одну или несколько цифр.


В примере выполнения кода:

else if (value.matches("-?\\d+(\\.\\d+)?([df])?")) {

Значение типа Double или Float. Если строка, содержащаяся в переменной , значение соответствует числовому значению со знаком или без знака типа Integer или Double / Float, содержащему одну или несколько цифр, и содержит букву d ИЛИ букву f в конце .


В примере выполнения код:

if (value.matches("-?\\d+(\\.\\d+)?d")) {

A Двойное значение. Если строка, содержащаяся в переменной , значение соответствует числовому значению со знаком или без знака типа Integer или Double / Float, содержащему одну или несколько цифр, и содержит в конце букву d (как в: 345d или 343.42d).

Например, код запуска:

if (value.matches("-?\\d+(\\.\\d+)?f")) {

A Значение с плавающей запятой. Если строка, содержащаяся в переменной , значение соответствует числовому значению со знаком или без знака типа Integer или Double / Float, содержащему одну или несколько цифр, и содержит в конце букву f (как в: 345f или 343,42f).

0 голосов
/ 02 марта 2020

Если у вас есть только строка (т. Е. «Значение» было получено в другом месте), вы можете сделать это:

try {
   int ival = Integer.valueOf(value);
  ... // do something with the int
} catch (NumberFormatException ei) 
   // it isn't an integer, so try it as a double
   try {
      double dval = Double.valueOf(value);
      ... // do something with it
   } catch ( NumberFormatException ed ) {
      // Not a double, either. Assume it is boolean
      boolean b = Boolean.valueOf(value);
      ...
   }
}
...