From 55b8fdc47ad75caa448b4ca5241ae4eb70cade86 Mon Sep 17 00:00:00 2001 From: Philip Heltweg Date: Mon, 18 Dec 2023 15:05:07 +0100 Subject: [PATCH 1/2] Adapted number regex to allow scientific notation --- .../internal-representation-parsing.ts | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/libs/execution/src/lib/types/valuetypes/internal-representation-parsing.ts b/libs/execution/src/lib/types/valuetypes/internal-representation-parsing.ts index 087b414a6..361c6d0a9 100644 --- a/libs/execution/src/lib/types/valuetypes/internal-representation-parsing.ts +++ b/libs/execution/src/lib/types/valuetypes/internal-representation-parsing.ts @@ -11,10 +11,7 @@ import { ValuetypeVisitor, } from '@jvalue/jayvee-language-server'; -const DECIMAL_COMMA_SEPARATOR_REGEX = /^[+-]?([0-9]*[,])?[0-9]+$/; -const DECIMAL_DOT_SEPARATOR_REGEX = /^[+-]?([0-9]*[.])?[0-9]+$/; - -const INTEGER_REGEX = /^[+-]?[0-9]+$/; +const NUMBER_REGEX = /^[+-]?([0-9]*[,\\.])?[0-9]+([eE][+\\-]?\d+)?$/; const TRUE_REGEX = /^true$/i; const FALSE_REGEX = /^false$/i; @@ -47,24 +44,32 @@ class InternalRepresentationParserVisitor extends ValuetypeVisitor< } visitDecimal(): number | undefined { - let sanitizedValue: string; - if (DECIMAL_COMMA_SEPARATOR_REGEX.test(this.value)) { - sanitizedValue = this.value.replace(',', '.'); - } else if (DECIMAL_DOT_SEPARATOR_REGEX.test(this.value)) { - sanitizedValue = this.value; - } else { + if (!NUMBER_REGEX.test(this.value)) { return undefined; } - return Number.parseFloat(sanitizedValue); + return Number.parseFloat(this.value.replace(',', '.')); } visitInteger(): number | undefined { - if (!INTEGER_REGEX.test(this.value)) { + /** + * Reuse decimal number parsing to capture valid scientific notation + * of integers like 5.3e3 = 5300. In contrast to decimal, if the final number + * is not a valid integer, returns undefined. + */ + const decimalNumber = this.visitDecimal(); + + if (decimalNumber === undefined) { + return undefined; + } + + const integerNumber = Math.trunc(decimalNumber); + + if (decimalNumber !== integerNumber) { return undefined; } - return Number.parseInt(this.value, 10); + return integerNumber; } visitText(): string { From 8b68399d461e1470edb66931c129ae0c50021557 Mon Sep 17 00:00:00 2001 From: Philip Heltweg Date: Tue, 19 Dec 2023 11:11:32 +0100 Subject: [PATCH 2/2] Removed not needed escape characters --- .../src/lib/types/valuetypes/internal-representation-parsing.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/execution/src/lib/types/valuetypes/internal-representation-parsing.ts b/libs/execution/src/lib/types/valuetypes/internal-representation-parsing.ts index 361c6d0a9..9220d51bb 100644 --- a/libs/execution/src/lib/types/valuetypes/internal-representation-parsing.ts +++ b/libs/execution/src/lib/types/valuetypes/internal-representation-parsing.ts @@ -11,7 +11,7 @@ import { ValuetypeVisitor, } from '@jvalue/jayvee-language-server'; -const NUMBER_REGEX = /^[+-]?([0-9]*[,\\.])?[0-9]+([eE][+\\-]?\d+)?$/; +const NUMBER_REGEX = /^[+-]?([0-9]*[,.])?[0-9]+([eE][+-]?\d+)?$/; const TRUE_REGEX = /^true$/i; const FALSE_REGEX = /^false$/i;