Конвертировать VB Val в Java? - PullRequest
3 голосов
/ 12 мая 2009

Как реализовать функцию Val () VB с использованием языка программирования Java или есть какой-либо API с таким же методом?

Ответы [ 6 ]

7 голосов
/ 12 мая 2009

Вы должны использовать Integer.parseInt, Float.parseFloat, Double.parseDouble и т. Д. - или NumberFormat вместо этого, в зависимости от того, хотите ли вы обрабатывать ввод с учетом культурных особенностей или нет.

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

4 голосов
/ 12 мая 2009

Если мои навыки Google служат мне, Val() преобразует строку в число; это правильно?

Если это так, Integer.parseInt(myString) или Double.parseDouble(myString) являются ближайшими эквивалентами Java. Однако любой недопустимый символ заставляет их обрабатывать всю строку как недопустимую; скажем, вы не можете разобрать номера улиц по адресам с ними.

Редактировать: Вот метод, который является более близким эквивалентом:

public static double val(String str) {
    StringBuilder validStr = new StringBuilder();
    boolean seenDot = false;   // when this is true, dots are not allowed
    boolean seenDigit = false; // when this is true, signs are not allowed
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (c == '.' && !seenDot) {
            seenDot = true;
            validStr.append(c);
        } else if ((c == '-' || c == '+') && !seenDigit) {
            validStr.append(c);
        } else if (Character.isDigit(c)) {
            seenDigit = true;
            validStr.append(c);
        } else if (Character.isWhitespace(c)) {
            // just skip over whitespace
            continue;
        } else {
            // invalid character
            break;
        }
    }
    return Double.parseDouble(validStr.toString());
}

Тест:

public static void main(String[] args) {
    System.out.println(val(" 1615 198th Street N.E."));
    System.out.println(val("2457"));
    System.out.println(val(" 2 45 7"));
    System.out.println(val("24 and 57"));
}

Выход:

1615198.0
2457.0
2457.0
24.0

Я не могу ручаться за его скорость, но вполне вероятно, что Double.parseDouble самая дорогая часть. Я полагаю, что в этой функции также может быть немного быстрее выполнить двойной анализ, но я был бы уверен, что это узкое место в первую очередь. В противном случае, это просто не стоит проблем.

0 голосов
/ 13 июня 2014
0 голосов
/ 12 мая 2009
ValResult = Val(" 1615 198th Street N.E.") ' ValResult is set to 1615198
ValResult = Val("2457")                    ' ValResult is set to 2457.
ValResult = Val(" 2 45 7")                 ' ValResult is set to 2457.
ValResult = Val("24 and 57")               ' ValResult is set to 24.

любой API Java может вести себя так же?

0 голосов
/ 12 мая 2009

попробуйте это:

Number Val(String value) {
    try {
        return NumberFormat.getNumberInstance().parse(value);
    } catch (ParseException e) {
        throw new IllegalArgumentException(value + " is not a number");
    }
}


Number a = Val("10");     // a instanceof Long 
Number b = Val("1.32");   // b instanceof Double
Number c = Val("0x100");  // c instanceof Long
0 голосов
/ 12 мая 2009

Если вы хотите преобразовать строку в целое число, используйте:

int x = Integer.parseInt(aString);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...