Skip to content

Commit 76b8c25

Browse files
CEL Dev Teamcopybara-github
authored andcommitted
Add fallback implementation for floating point formatting in case no ICU locales are available.
PiperOrigin-RevId: 720954816
1 parent 3824596 commit 76b8c25

2 files changed

Lines changed: 26 additions & 5 deletions

File tree

extensions/formatting.cc

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
151169
absl::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

162183
void StrAppendQuoted(ValueKind kind, absl::string_view value,

extensions/strings_test.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ TEST(Strings, Format) {
240240
ASSERT_OK_AND_ASSIGN(auto runtime, std::move(builder).Build());
241241

242242
ASSERT_OK_AND_ASSIGN(ParsedExpr expr,
243-
Parse("'abc %f'.format([2.0]) == 'abc 2.000000'",
243+
Parse("'abc %.3f'.format([2.0]) == 'abc 2.000'",
244244
"<input>", ParserOptions{}));
245245

246246
ASSERT_OK_AND_ASSIGN(std::unique_ptr<Program> program,

0 commit comments

Comments
 (0)