From d40eb112448dded1c0aae3b07ae1bc248abaeb17 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 12 Aug 2013 09:43:31 +0200
Subject: [PATCH] OO-685: accept comma as separator for float in QTI <=, >=, <,
 and > test, and prevent red screen if the format of the float cannot be
 parsed

---
 .../ims/qti/process/elements/QTI_vargt.java   | 19 +++++++++++++------
 .../ims/qti/process/elements/QTI_vargte.java  | 19 +++++++++++++++----
 .../ims/qti/process/elements/QTI_varlt.java   | 19 ++++++++++++++++---
 .../ims/qti/process/elements/QTI_varlte.java  | 18 +++++++++++++++---
 4 files changed, 59 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti/process/elements/QTI_vargt.java b/src/main/java/org/olat/ims/qti/process/elements/QTI_vargt.java
index 7f0d2602bc1..8b118b29c06 100644
--- a/src/main/java/org/olat/ims/qti/process/elements/QTI_vargt.java
+++ b/src/main/java/org/olat/ims/qti/process/elements/QTI_vargt.java
@@ -44,7 +44,6 @@ public class QTI_vargt implements BooleanEvaluable {
 	 * @return
 	 */
 	public boolean eval(Element boolElement, ItemContext userContext, EvalContext ect) {
-		boolean ok = false;
 		ItemInput iinp = userContext.getItemInput();
 		if (iinp.isEmpty()) return false; // user has given no answer
 		String respident = boolElement.attributeValue("respident");
@@ -56,13 +55,21 @@ public class QTI_vargt implements BooleanEvaluable {
 		// Integer
 		shouldVal = shouldVal.trim();
 		isVal = isVal.trim();
+		float fs = Float.parseFloat(shouldVal);
+		float fi;
 		try {
-			Float fs = new Float(shouldVal);
-			Float fi = new Float(isVal);
-			ok = (fi.floatValue() > fs.floatValue());
-		} catch (NumberFormatException nfe) {
-			//  
+			fi = Float.parseFloat(isVal);
+		} catch (NumberFormatException e) {
+			//try to replace , -> .
+			isVal = isVal.replace(',', '.');
+			try {
+				fi = Float.parseFloat(isVal);
+			} catch (NumberFormatException e1) {
+				//we try all what we can to understand the input value -> false
+				return false;
+			}
 		}
+		boolean ok = (fi > fs);
 		return ok;
 	}
 
diff --git a/src/main/java/org/olat/ims/qti/process/elements/QTI_vargte.java b/src/main/java/org/olat/ims/qti/process/elements/QTI_vargte.java
index face4362d6f..83d69f04a1c 100644
--- a/src/main/java/org/olat/ims/qti/process/elements/QTI_vargte.java
+++ b/src/main/java/org/olat/ims/qti/process/elements/QTI_vargte.java
@@ -51,10 +51,21 @@ public class QTI_vargte implements BooleanEvaluable {
 		// we use Float so we are on the safe side, even if comparison was only Integer
 		shouldVal = shouldVal.trim();
 		isVal = isVal.trim();
-		Float fs = new Float(shouldVal);
-		Float fi = new Float(isVal);
-		boolean ok = (fi.floatValue() >= fs.floatValue());
+		float fs = Float.parseFloat(shouldVal);
+		float fi;
+		try {
+			fi = Float.parseFloat(isVal);
+		} catch (NumberFormatException e) {
+			//try to replace , -> .
+			isVal = isVal.replace(',', '.');
+			try {
+				fi = Float.parseFloat(isVal);
+			} catch (NumberFormatException e1) {
+				//we try all what we can to understand the input value -> false
+				return false;
+			}
+		}
+		boolean ok = (fi >= fs);
 		return ok;
 	}
-
 }
diff --git a/src/main/java/org/olat/ims/qti/process/elements/QTI_varlt.java b/src/main/java/org/olat/ims/qti/process/elements/QTI_varlt.java
index 9e925913805..8d9a8cf581d 100644
--- a/src/main/java/org/olat/ims/qti/process/elements/QTI_varlt.java
+++ b/src/main/java/org/olat/ims/qti/process/elements/QTI_varlt.java
@@ -52,9 +52,22 @@ public class QTI_varlt implements BooleanEvaluable {
 		// we use Float so we are on the safe side, even if comparison was only Integer
 		shouldVal = shouldVal.trim();
 		isVal = isVal.trim();
-		Float fs = new Float(shouldVal);
-		Float fi = new Float(isVal);
-		boolean ok = (fi.floatValue() < fs.floatValue());
+		float fs = Float.parseFloat(shouldVal);
+		float fi;
+		try {
+			fi = Float.parseFloat(isVal);
+		} catch (NumberFormatException e) {
+			//try to replace , -> .
+			isVal = isVal.replace(',', '.');
+			try {
+				fi = Float.parseFloat(isVal);
+			} catch (NumberFormatException e1) {
+				//we try all what we can to understand the input value -> false
+				return false;
+			}
+		}
+		
+		boolean ok = (fi < fs);
 		return ok;
 	}
 
diff --git a/src/main/java/org/olat/ims/qti/process/elements/QTI_varlte.java b/src/main/java/org/olat/ims/qti/process/elements/QTI_varlte.java
index a6b2be2019c..aa01acd165e 100644
--- a/src/main/java/org/olat/ims/qti/process/elements/QTI_varlte.java
+++ b/src/main/java/org/olat/ims/qti/process/elements/QTI_varlte.java
@@ -52,9 +52,21 @@ public class QTI_varlte implements BooleanEvaluable {
 		// we use Float so we are on the safe side, even if comparison was only Integer
 		shouldVal = shouldVal.trim();
 		isVal = isVal.trim();
-		Float fs = new Float(shouldVal);
-		Float fi = new Float(isVal);
-		boolean ok = (fi.floatValue() <= fs.floatValue());
+		float fs = Float.parseFloat(shouldVal);
+		float fi;
+		try {
+			fi = Float.parseFloat(isVal);
+		} catch (NumberFormatException e) {
+			//try to replace , -> .
+			isVal = isVal.replace(',', '.');
+			try {
+				fi = Float.parseFloat(isVal);
+			} catch (NumberFormatException e1) {
+				//we try all what we can to understand the input value -> false
+				return false;
+			}
+		}
+		boolean ok = (fi <= fs);
 		return ok;
 	}
 
-- 
GitLab