Как вы знаете, между 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).