Merge PR #1937: Keep date text with signed parts like +3/4/2026 as text

crates/core/src/parse.rs: kept both tests; parse_time keeps the plain_number parsing from #1552 plus the redundant '+' guard from #1937.
This commit is contained in:
aiongg
2026-10-22 02:35:42 +00:00
+16 -2
View File
@@ -198,7 +198,7 @@ fn parse_time(t: &str) -> Option<(f64, bool, bool)> {
if parts.len() == 1 && ampm.is_none() {
return None;
}
if parts.len() > 3 || parts.iter().any(|p| p.is_empty()) {
if parts.len() > 3 || parts.iter().any(|p| p.is_empty() || p.starts_with('+')) {
return None;
}
let mut h = plain_number(parts.first()?, false)?;
@@ -225,7 +225,13 @@ fn parse_time(t: &str) -> Option<(f64, bool, bool)> {
fn parse_date(t: &str, sys: DateSystem) -> Option<(f64, &'static str)> {
let t = t.trim().trim_end_matches(',');
let num = |s: &str| s.trim().parse::<i64>().ok();
let num = |s: &str| {
let s = s.trim();
if s.is_empty() || !s.bytes().all(|b| b.is_ascii_digit()) {
return None;
}
s.parse::<i64>().ok()
};
// ISO yyyy-mm-dd or yyyy/mm/dd
let seps: &[char] = &['/', '-', '.'];
let parts: Vec<&str> = t.split(seps).collect();
@@ -347,6 +353,14 @@ mod tests {
}
}
#[test]
fn signed_date_parts_stay_text() {
for s in ["+3/4/2026", "3/+4/2026", "3/4/+2026", "1/1/2020 +5:00"] {
assert_eq!(p(s).value, Value::text(s), "{s}");
}
assert_eq!(p("3/4/2026").value, Value::Number(46085.0));
}
#[test]
fn month_name_short_year() {
for s in ["Mar 4, 26", "Mar 4 26", "March 4 26", "4 March 26", "Mar 4, 2026"] {