From d158c9a89af98ebcfc6e2becaeb5fb25d5178fa7 Mon Sep 17 00:00:00 2001 From: Camilo Diaz Repka Date: Fri, 26 Jun 2026 19:47:19 +0200 Subject: [PATCH] expose fractionalSecondDigits as a property of resolvedOptions() --- .../src/builtins/intl/date_time_format/mod.rs | 18 +++++++++++++++++- .../builtins/intl/date_time_format/options.rs | 12 ++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/core/engine/src/builtins/intl/date_time_format/mod.rs b/core/engine/src/builtins/intl/date_time_format/mod.rs index b888eebbe21..a05f6439ca1 100644 --- a/core/engine/src/builtins/intl/date_time_format/mod.rs +++ b/core/engine/src/builtins/intl/date_time_format/mod.rs @@ -17,7 +17,9 @@ use crate::{ }, intl::{ Service, - date_time_format::options::{DateStyle, FormatMatcher, FormatOptions, TimeStyle}, + date_time_format::options::{ + DateStyle, FormatMatcher, FormatOptions, SubsecondDigits, TimeStyle, + }, locale::{canonicalize_locale_list, filter_locales, resolve_locale}, options::{IntlOptions, coerce_options_to_object}, }, @@ -87,6 +89,7 @@ pub(crate) struct DateTimeFormat { hour_cycle: Option, date_style: Option, time_style: Option, + fractional_second_digits: Option, time_zone: FormatTimeZone, fieldset: CompositeFieldSet, formatter: DateTimeFormatter, @@ -415,6 +418,18 @@ impl DateTimeFormat { options.property(js_string!("hour12"), hour12, Attribute::all()); } + // Per Table 15, fractionalSecondDigits is only reported when neither + // dateStyle nor timeStyle is set; the constructor already guarantees this by + // rejecting explicit component options alongside a style, so the value is + // `None` whenever a style is present. + if let Some(fsd) = dtf.fractional_second_digits { + options.property( + js_string!("fractionalSecondDigits"), + fsd.digits(), + Attribute::all(), + ); + } + if let Some(ds) = dtf.date_style { let ds_str = match ds { DateStyle::Full => "full", @@ -816,6 +831,7 @@ pub(crate) fn create_date_time_format( hour_cycle: intl_options.preferences.hour_cycle, date_style, time_style, + fractional_second_digits: format_options.fractional_second_digits(), time_zone, fieldset, formatter, diff --git a/core/engine/src/builtins/intl/date_time_format/options.rs b/core/engine/src/builtins/intl/date_time_format/options.rs index e307ed84269..182575cf068 100644 --- a/core/engine/src/builtins/intl/date_time_format/options.rs +++ b/core/engine/src/builtins/intl/date_time_format/options.rs @@ -207,6 +207,10 @@ impl FormatOptions { }) } + pub(super) fn fractional_second_digits(&self) -> Option { + self.fractional_second_digits + } + pub(super) fn set_date_defaults(&mut self) { self.year = Some(Year::Numeric); self.month = Some(Month::Numeric); @@ -536,6 +540,14 @@ impl SubsecondDigits { _ => unreachable!("subSecondDigits must be previously constrained."), } } + + pub(super) fn digits(self) -> u8 { + match self { + SubsecondDigits::S1 => 1, + SubsecondDigits::S2 => 2, + SubsecondDigits::S3 => 3, + } + } } impl From for IcuSubsecondDigits {