aboutsummaryrefslogtreecommitdiff
path: root/src/number.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/number.ts')
-rw-r--r--src/number.ts87
1 files changed, 31 insertions, 56 deletions
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
}
}