@@ -148,15 +148,36 @@ absl::StatusOr<Formatter> CreateDoubleNumberFormater(
148148 return result;
149149}
150150
151+ absl::StatusOr<absl::string_view> FormatDoubleFallback (
152+ double value, std::optional<int > min_precision,
153+ std::optional<int > max_precision, bool use_scientific_notation,
154+ absl::string_view unit,
155+ std::string& scratch ABSL_ATTRIBUTE_LIFETIME_BOUND) {
156+ static constexpr int kDefaultPrecision = 6 ;
157+ auto format = absl::StrCat (" %." , min_precision.value_or (kDefaultPrecision ),
158+ use_scientific_notation ? " e" : " f" , " %s" );
159+ if (use_scientific_notation) {
160+ scratch = absl::StrFormat (*absl::ParsedFormat<' e' , ' s' >::New (format), value,
161+ unit);
162+ } else {
163+ scratch = absl::StrFormat (*absl::ParsedFormat<' f' , ' s' >::New (format), value,
164+ unit);
165+ }
166+ return scratch;
167+ }
168+
151169absl::StatusOr<absl::string_view> FormatDouble (
152170 double value, std::optional<int > min_precision,
153171 std::optional<int > max_precision, bool use_scientific_notation,
154172 absl::string_view unit, const icu::Locale& locale,
155173 std::string& scratch ABSL_ATTRIBUTE_LIFETIME_BOUND) {
156- CEL_ASSIGN_OR_RETURN (auto formatter, CreateDoubleNumberFormater (
157- min_precision, max_precision,
158- use_scientific_notation, locale));
159- return formatter.Format (value, unit, scratch);
174+ auto formatter = CreateDoubleNumberFormater (min_precision, max_precision,
175+ use_scientific_notation, locale);
176+ if (!formatter.ok ()) {
177+ return FormatDoubleFallback (value, min_precision, max_precision,
178+ use_scientific_notation, unit, scratch);
179+ }
180+ return formatter->Format (value, unit, scratch);
160181}
161182
162183void StrAppendQuoted (ValueKind kind, absl::string_view value,
0 commit comments