TheAlgorithms/JavaScript · error · Error
Improper string encoding
Error message
Improper string encoding
What it means
Thrown by Month.parseDate(date) (plain Error) when the parsed date does not yield exactly two components. The parser splits the string on '/' and pushes each block; it expects the format mm/yyyy (exactly one slash, two blocks). Any other number of slashes/blocks triggers the error.
Source
Thrown at Dynamic-Programming/FindMonthCalendar.js:53
output(row)
if (dates.length === 0) break
}
}
parseDate(date) {
const dateAr = []
let block = ''
let i
for (i = 0; i < date.length; i++) {
if (date[i] === '/') {
dateAr.push(parseInt(block))
block = ''
continue
}
block += date[i]
}
dateAr.push(parseInt(block))
if (dateAr.length !== 2) throw new Error('Improper string encoding')
const dateOb = { month: dateAr[0], year: dateAr[1] }
return dateOb
}
isGreater(startDate, endDate) {
if (startDate.year > endDate.year) {
return true
} else if (startDate.year < endDate.year) {
return false
} else if (startDate.month > endDate.month) {
return true
} else if (startDate.month < endDate.month) {
return false
}
return true
}
getDayDiff(startDate, endDate) {View on GitHub (pinned to 5c39e87a9a)
Solutions
- Format input strictly as mm/yyyy with a single slash before calling parseDate.
- Pre-validate with a regex: /^(0?[1-9]|1[0-2])\/\d{4}$/.
- Normalize other formats (yyyy-mm-dd, dd/mm/yyyy) into mm/yyyy upstream.
- Reject empty strings and strings without exactly one '/' before calling the parser.
Example fix
// before
month.parseDate('2020-01-15') // throws: not mm/yyyy
// after
const m = String(rawDate.month).padStart(2, '0')
const y = String(rawDate.year)
month.parseDate(`${m}/${y}`) Defensive patterns
Strategy: validation
Validate before calling
const MM_YYYY = /^(0?[1-9]|1[0-2])\/\d{4}$/
function safeParseDate(month, monthObj) {
const m = String(monthObj.month).padStart(2, '0')
const y = String(monthObj.year)
const s = `${m}/${y}`
if (!MM_YYYY.test(s)) throw new Error(`expected mm/yyyy, got '${s}'`)
return month.parseDate(s)
} Type guard
const isMmYyyy = (s) => /^(0?[1-9]|1[0-2])\/\d{4}$/.test(s) Try / catch
try {
return month.parseDate(input)
} catch (e) {
if (e instanceof Error && /improper string encoding/i.test(e.message)) {
// normalize input to mm/yyyy and retry, or surface a friendly error
} else throw e
} Prevention
- Format input strictly as mm/yyyy with a single slash before parsing.
- Reject dd/mm/yyyy (two slashes) and ISO yyyy-mm-dd upstream.
- Use a regex pre-check so users get a clear format error.
- Don't pass raw user strings; build the string from numeric fields.
When it happens
Trigger: parseDate('1') (zero slashes -> 1 block); parseDate('1/2020/extra') (two slashes -> 3 blocks); parseDate('') (1 empty block); parseDate('1-2020') (no slash -> 1 block '1-2020').
Common situations: Passing dd/mm/yyyy (two slashes); passing ISO yyyy-mm-dd; missing the year; using dashes or dots instead of slashes; locale-formatted dates.
Related errors
- Input should be integer
- Input should be integer
- Triplet cannot exist with the given array
- The sum must be non-negative.
- All of the inputs of the array must be positive.
AI-assisted analysis of TheAlgorithms/JavaScript@5c39e87a9a (2026-08-13).
Data as JSON: /api/errors/8b2588fe71de6f36.
Report an issue: GitHub.