Библиотека Java, чтобы проверить, содержит ли Строка число *без* исключения

Я использую CxxTest для встроенного c/c ++ среда (прежде всего, C++).

я предпочитаю CxxTest, потому что он имеет perl/python сценарий для создания исполнителя тестов. После маленького наклона для получения его установка (меньший все еще, так как Вы не должны писать исполнитель тестов) это довольно просто в использовании (включает образцы и полезную документацию). Большая часть работы настраивала 'аппаратные средства' доступы кода, таким образом, я мог тест единицы/модуля эффективно. После этого легко добавить новые случаи модульного теста.

, Как упомянуто ранее это - платформа модульного теста C/C++. Таким образом, Вам будет нужен компилятор C++.

руководство пользователя CxxTest Wiki

CxxTest

8
задан tddmonkey 22 July 2009 в 07:40
поделиться

5 ответов

Я бы не стал изобретать этот метод заново и выбрал Apache Commons. Если вы используете Spring, Struts или многие другие часто используемые библиотеки java, они часто включают в себя общие ресурсы Apache. Вам понадобится файл commons-lang.jar. Вот метод из NumberUtils , который вам может понадобиться:

isNumber[1]

public static boolean isNumber(java.lang.String str)
Checks whether the String a valid Java number.

Valid numbers include hexadecimal marked with the 0x qualifier, scientific notation and numbers marked with a type qualifier (e.g. 123L).

Null and empty String will return false.

Parameters:
str - the String to check
Returns:
true if the string is a correctly formatted number
6
ответ дан 5 December 2019 в 10:43
поделиться
3
ответ дан 5 December 2019 в 10:43
поделиться

Точное регулярное выражение указано в документации Javadocs для Double.valueOf (String) .

Чтобы избежать вызова этого метода для недопустимой строки и наличия ] NumberFormatException , приведенное ниже регулярное выражение может быть использовано для проверки входной строки:

 final String Digits = "(\\ p {Digit} +)";
последняя строка HexDigits = "(\\ p {XDigit} +)";
// показатель степени равен 'e' или 'E', за которым следует необязательно 
// знаковое десятичное целое число.
последняя строка Exp = "[eE] [+ -]?" + Digits;
последняя строка fpRegex =
 ("[\\ x00 - \\ x20] *" + // Необязательный начальный "пробел"
 "[+ -]? (" + // Необязательный знаковый символ
"NaN |" + // строка "NaN"
"Бесконечность |" + // Строка "бесконечность"

 // Десятичная строка с плавающей запятой, представляющая конечное положительное число
 // число без ведущего знака состоит не более чем из пяти основных частей:
// Цифры. Цифры ExponentPart FloatTypeSuffix
 // 
 // Поскольку этот метод позволяет использовать в качестве входных данных только целочисленные строки
 // в дополнение к строкам литералов с плавающей запятой,
 // два нижеприведенных подшаблона являются упрощениями грамматики
 // продукция из Спецификации языка Java, 2-я 
 // редакция, раздел 3.10.2.

 // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
 "(((" + Digits + "(\\.)? (" + Digits + "?) (" + Exp + ")?) |" +

//. Цифры ExponentPart_opt FloatTypeSuffix_opt
 "(\\. (" + Digits + ") (" + Exp + ")?) |" +

 // Шестнадцатеричные строки
 "((" +
 // 0 [xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
"(0 [xX]" + HexDigits + "(\\.)?) |" +

// 0 [xX] HexDigits_opt. HexDigits BinaryExponent FloatTypeSuffix_opt
 "(0 [xX]" + HexDigits + "? (\\.)" + HexDigits + ")" +

") [pP] [+ -]?" + Цифры + "))" +
 "[fFdD]?))" +
"[\ x00 - \\ x20] *"); // Необязательный завершающий "пробел"

если (Pattern.matches (fpRegex, myString))
Double.valueOf (myString); // не будет генерировать NumberFormatException
else {
 // Выполняем подходящее альтернативное действие
}
3
ответ дан 5 December 2019 в 10:43
поделиться

Вот функция утилиты, основанная на регулярном выражении, работающая нормально (не удалось разместить проверку "" в регулярном выражении, сохраняя его читабельность):

public class TestRegexp {
    static final String NUM_REGEX=
        "-?((([0-9]{1,3})(,[0-9]{3})*)|[0-9]*)(\\.[0-9]+)?([Ee][0-9]*)?";
    public static boolean isNum(String s) {
            return s!=null && s.length()>0 && s.matches(NUM_REGEX);  
    }
    public static void main(String[]args) {
        String[] values={
                "",
                "0",
                "0.1",
                ".1",
                "-.5E5",
                "-12,524.5E5",
                "-452,456,456,466.5E5",
                "-452,456,456,466E5",
                "22,22,2.14123415e1",
        };
        for (String value : values) {
            System.out.println(value+" is a number: "
            +isNum(value));
        }
    }

}
2
ответ дан 5 December 2019 в 10:43
поделиться

Да, регулярное выражение должно помочь. Я знаю только .Net regexp, но все языки регулярных выражений довольно похожи, так что это должно помочь вам начать. Я не тестировал его, поэтому вы можете немного поработать с ним с помощью класса Java regex.

"-?(([0-9]{1,3}(,[0-9{3,3})*)|[0-9]*)(\.[0-9]+(e-?[0-9]*)?)?"

Некоторые из синтаксиса элемента управления Regex:
? - Необязательный элемент
| - Оператор ИЛИ. Обычно я разрешал числа с запятыми или без них, если они были отформатированы правильно.
[] - Набор разрешенных символов
{,} - Минимальный максимум элемента
* - Любое количество элементов, от 0 до бесконечности
+ - хотя бы один элемент, от 1 до бесконечности
\ - escape-символ
. - Любой символ (поэтому он был экранирован)

2
ответ дан 5 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: