1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-08 20:27:35 +00:00

LibJS: Begin implementing Intl.NumberFormat.prototype.format

There is quite a lot to be done here so this is just a first pass at
number formatting. Decimal and percent formatting are mostly working,
but only for standard and compact notation (engineering and scientific
notation are not implemented here). Currency formatting is parsed, but
there is more work to be done to handle e.g. using symbols instead of
currency codes ("$" instead of "USD"), and putting spaces around the
currency symbol ("USD 2.00" instead of "USD2.00").
This commit is contained in:
Timothy Flynn 2021-11-10 12:34:14 -05:00 committed by Linus Groh
parent 0469006263
commit 89523f70cf
8 changed files with 1433 additions and 1 deletions

View file

@ -0,0 +1,57 @@
/*
* Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibJS/Runtime/GlobalObject.h>
#include <LibJS/Runtime/Intl/NumberFormat.h>
#include <LibJS/Runtime/Intl/NumberFormatFunction.h>
namespace JS::Intl {
// 15.1.4 Number Format Functions
NumberFormatFunction* NumberFormatFunction::create(GlobalObject& global_object, NumberFormat& number_format)
{
return global_object.heap().allocate<NumberFormatFunction>(global_object, number_format, *global_object.function_prototype());
}
NumberFormatFunction::NumberFormatFunction(NumberFormat& number_format, Object& prototype)
: NativeFunction(prototype)
, m_number_format(number_format)
{
}
void NumberFormatFunction::initialize(GlobalObject& global_object)
{
Base::initialize(global_object);
define_direct_property(vm().names.length, Value(1), Attribute::Configurable);
}
ThrowCompletionOr<Value> NumberFormatFunction::call()
{
auto& global_object = this->global_object();
auto& vm = global_object.vm();
// 1. Let nf be F.[[NumberFormat]].
// 2. Assert: Type(nf) is Object and nf has an [[InitializedNumberFormat]] internal slot.
// 3. If value is not provided, let value be undefined.
auto value = vm.argument(0);
// 4. Let x be ? ToNumeric(value).
value = TRY(value.to_numeric(global_object));
// 5. Return ? FormatNumeric(nf, x).
// Note: Our implementation of FormatNumeric does not throw.
auto formatted = format_numeric(m_number_format, value.as_double());
return js_string(vm, move(formatted));
}
void NumberFormatFunction::visit_edges(Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
visitor.visit(&m_number_format);
}
}