111 lines
2.4 KiB
JavaScript
111 lines
2.4 KiB
JavaScript
const GERMAN_NUMBER_WORDS = new Map([
|
|
['null', '0'],
|
|
['ein', '1'],
|
|
['eins', '1'],
|
|
['eine', '1'],
|
|
['einen', '1'],
|
|
['einem', '1'],
|
|
['einer', '1'],
|
|
['zwei', '2'],
|
|
['drei', '3'],
|
|
['vier', '4'],
|
|
['fuenf', '5'],
|
|
['funf', '5'],
|
|
['fünf', '5'],
|
|
['sechs', '6'],
|
|
['sieben', '7'],
|
|
['acht', '8'],
|
|
['neun', '9'],
|
|
['zehn', '10'],
|
|
['elf', '11'],
|
|
['zwoelf', '12'],
|
|
['zwolf', '12'],
|
|
['zwölf', '12'],
|
|
['dreizehn', '13'],
|
|
['vierzehn', '14'],
|
|
['fuenfzehn', '15'],
|
|
['funfzehn', '15'],
|
|
['fünfzehn', '15'],
|
|
['sechzehn', '16'],
|
|
['siebzehn', '17'],
|
|
['achtzehn', '18'],
|
|
['neunzehn', '19'],
|
|
['zwanzig', '20'],
|
|
['dreissig', '30'],
|
|
['dreißig', '30'],
|
|
['vierzig', '40'],
|
|
['fuenfzig', '50'],
|
|
['funfzig', '50'],
|
|
['fünfzig', '50'],
|
|
['sechzig', '60'],
|
|
['siebzig', '70'],
|
|
['achtzig', '80'],
|
|
['neunzig', '90'],
|
|
['hundert', '100'],
|
|
['einhundert', '100'],
|
|
['tausend', '1000'],
|
|
['eintausend', '1000'],
|
|
['zweitausend', '2000']
|
|
]);
|
|
|
|
const GERMAN_ONES = [
|
|
['', ''],
|
|
['ein', 'eins'],
|
|
['zwei'],
|
|
['drei'],
|
|
['vier'],
|
|
['fuenf', 'funf', 'fünf'],
|
|
['sechs'],
|
|
['sieben'],
|
|
['acht'],
|
|
['neun']
|
|
];
|
|
|
|
const GERMAN_TENS = {
|
|
20: ['zwanzig'],
|
|
30: ['dreissig', 'dreißig'],
|
|
40: ['vierzig'],
|
|
50: ['fuenfzig', 'funfzig', 'fünfzig'],
|
|
60: ['sechzig'],
|
|
70: ['siebzig'],
|
|
80: ['achtzig'],
|
|
90: ['neunzig']
|
|
};
|
|
|
|
for (const [tensValue, tensWords] of Object.entries(GERMAN_TENS)) {
|
|
const tens = Number(tensValue);
|
|
for (let one = 1; one <= 9; one += 1) {
|
|
for (const oneWord of GERMAN_ONES[one]) {
|
|
for (const tenWord of tensWords) {
|
|
GERMAN_NUMBER_WORDS.set(`${oneWord}und${tenWord}`, String(tens + one));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function stripGermanNumberSeparators(value) {
|
|
return String(value || '')
|
|
.replace(/[\s.-]+/g, '');
|
|
}
|
|
|
|
export function canonicalizeNumberAnswer(value) {
|
|
const raw = String(value || '').trim().toLowerCase();
|
|
if (!raw) return '';
|
|
|
|
const compact = stripGermanNumberSeparators(raw);
|
|
if (/^\d+$/.test(compact)) {
|
|
return String(Number(compact));
|
|
}
|
|
|
|
return GERMAN_NUMBER_WORDS.get(compact) || '';
|
|
}
|
|
|
|
export function normalizeComparableWithNumberWords(value, baseNormalizer) {
|
|
const rawCanonical = canonicalizeNumberAnswer(value);
|
|
if (rawCanonical) return rawCanonical;
|
|
|
|
const normalized = baseNormalizer(String(value || ''));
|
|
const normalizedCanonical = canonicalizeNumberAnswer(normalized);
|
|
return normalizedCanonical || normalized;
|
|
}
|