From 52d9d5d0853b16c20913963cf7f1d3a83e3f2c65 Mon Sep 17 00:00:00 2001 From: Joris Date: Sun, 9 Feb 2020 17:55:53 +0100 Subject: Improve parsing functions --- src/number.ts | 87 +++++++++++++++++++++-------------------------------------- 1 file changed, 31 insertions(+), 56 deletions(-) (limited to 'src/number.ts') diff --git a/src/number.ts b/src/number.ts index 3021dc9..6663329 100644 --- a/src/number.ts +++ b/src/number.ts @@ -1,82 +1,57 @@ import { h } from './dom' -export interface Parsed { +interface ParseInsideTextResult { before: string; number: number; after: string; } -export function parse(str: string): Parsed | undefined { - let start; - for (start = 0; start < str.length; start++) { - if (isDigit(str.charAt(start))) { - break - } - } - - if (start === str.length) { - return undefined - } - - // Integer part - let integerPart = ''; - let end = start; - for (; end < str.length; end++) { - const c = str.charAt(end) +export function parseInsideText(str: string): ParseInsideTextResult | undefined { + let res = str.match(/^([^\d]*)(\d+)((\.|,)(\d+))?(.*)/) - if (!isDigit(c)) { - break - } else { - integerPart += c + if (res !== null && res.length === 7) { + return { + before: res[1], + number: parseFloat(res[2] + '.' + res[5]), + after: res[6] } + } else { + return undefined; } +} - // Decimal sign - if (end < str.length && (str.charAt(end) === '.' || str.charAt(end) === ',')) { - end++ - } +interface ParseResult { + number: number; + remaining: string; +} - // Decimal part - let decimalPart = ''; - for (; end < str.length; end++) { - const c = str.charAt(end) +export function parse(str: string): ParseResult | undefined { + let res = str.match(/^(\d+)((\.|,)(\d+))?(.*$)/) - if (!isDigit(c)) { - break - } else { - decimalPart += c + if (res !== null && res.length === 6) { + return { + number: parseFloat(res[1] + '.' + res[4]), + remaining: res[5] } + } else { + return undefined; } - - - return { - before: str.substring(0, start), - number: parseFloat(integerPart + (decimalPart !== '' ? '.' + decimalPart : '')), - after: str.substring(end, str.length) - } -} - -function isDigit(c: string) { - return c >= '0' && c <= '9' } export interface Node { node: Element; - number: HTMLInputElement; + numberInput: HTMLInputElement; } -export function node(tag: string, parsedNumber: Parsed): Node { - const numberElement = h( - 'input', - { - 'class': 'g-Number', - 'value': prettyPrint(parsedNumber.number) - } - ) as HTMLInputElement +export function node(tag: string, content: ParseInsideTextResult): Node { + let numberInput = h('input', { + 'class': 'g-Number', + 'value': prettyPrint(content.number) + }) as HTMLInputElement return { - node: h(tag, {}, [parsedNumber.before, numberElement, parsedNumber.after]), - number: numberElement, + node: h(tag, {}, [content.before, numberInput, content.after]), + numberInput: numberInput } } -- cgit v1.2.3