Я использую CxxTest для встроенного c/c ++ среда (прежде всего, C++).
я предпочитаю CxxTest, потому что он имеет perl/python сценарий для создания исполнителя тестов. После маленького наклона для получения его установка (меньший все еще, так как Вы не должны писать исполнитель тестов) это довольно просто в использовании (включает образцы и полезную документацию). Большая часть работы настраивала 'аппаратные средства' доступы кода, таким образом, я мог тест единицы/модуля эффективно. После этого легко добавить новые случаи модульного теста.
, Как упомянуто ранее это - платформа модульного теста C/C++. Таким образом, Вам будет нужен компилятор C++.
руководство пользователя CxxTest Wiki
CxxTest
Я бы не стал изобретать этот метод заново и выбрал 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
Точное регулярное выражение указано в документации 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 { // Выполняем подходящее альтернативное действие }
Вот функция утилиты, основанная на регулярном выражении, работающая нормально (не удалось разместить проверку "" в регулярном выражении, сохраняя его читабельность):
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));
}
}
}
Да, регулярное выражение должно помочь. Я знаю только .Net regexp, но все языки регулярных выражений довольно похожи, так что это должно помочь вам начать. Я не тестировал его, поэтому вы можете немного поработать с ним с помощью класса Java regex.
"-?(([0-9]{1,3}(,[0-9{3,3})*)|[0-9]*)(\.[0-9]+(e-?[0-9]*)?)?"
Некоторые из синтаксиса элемента управления Regex:
? - Необязательный элемент
| - Оператор ИЛИ. Обычно я разрешал числа с запятыми или без них, если они были отформатированы правильно.
[] - Набор разрешенных символов
{,} - Минимальный максимум элемента
* - Любое количество элементов, от 0 до бесконечности
+ - хотя бы один элемент, от 1 до бесконечности
\ - escape-символ
. - Любой символ (поэтому он был экранирован)