Skip to content

Commit 937f833

Browse files
committed
Implement Number.toFixed
1 parent 1af3db3 commit 937f833

File tree

4 files changed

+23
-0
lines changed

4 files changed

+23
-0
lines changed

src/LuaLib.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export enum LuaLibFeature {
5858
NumberIsFinite = "NumberIsFinite",
5959
NumberIsNaN = "NumberIsNaN",
6060
NumberToString = "NumberToString",
61+
NumberToFixed = "NumberToFixed",
6162
ObjectAssign = "ObjectAssign",
6263
ObjectDefineProperty = "ObjectDefineProperty",
6364
ObjectEntries = "ObjectEntries",

src/lualib/NumberToFixed.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/// https://www.ecma-international.org/ecma-262/10.0/index.html#sec-number.prototype.tofixed
2+
export function __TS__NumberToFixed(this: number, fractionDigits?: number): string {
3+
if (Math.abs(this) >= 1e21 || this !== this) {
4+
return this.toString();
5+
}
6+
const f = Math.floor(fractionDigits ?? 0);
7+
if (f < 0 || f > 100) {
8+
throw "toFixed() digits argument must be between 0 and 100";
9+
}
10+
// throws "invalid format (width or precision too long)" if strlen > 99
11+
// if (f < 80) return fmt; else try {return fmt} catch(_) { throw "toFixed() digits argument..." }
12+
return string.format(`%.${f}f`, this);
13+
}

src/transformation/builtins/number.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export function transformNumberPrototypeCall(
2020
return params.length === 0
2121
? lua.createCallExpression(lua.createIdentifier("tostring"), [caller], node)
2222
: transformLuaLibFunction(context, LuaLibFeature.NumberToString, node, caller, ...params);
23+
case "toFixed":
24+
return transformLuaLibFunction(context, LuaLibFeature.NumberToFixed, node, caller, ...params);
2325
default:
2426
context.diagnostics.push(unsupportedProperty(calledMethod.name, "number", expressionName));
2527
}

test/unit/builtins/numbers.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ test.each([
6969
util.testExpressionTemplate`(${value}).toString(2)`.expectToEqual(luaNativeSpecialNumString);
7070
});
7171

72+
const toFixedRadixes = [undefined, 0, 1, 2, 5, 10, 80];
73+
const toFixedValues = [-1, 0, 1, /* 1.5 fails, */ 1024, 1.2, 1e19, 1e22];
74+
const toFixedPairs = toFixedValues.flatMap(value => toFixedRadixes.map(frac => [value, frac] as const));
75+
test.each(toFixedPairs)("(%p).toFixed(%p)", (value, frac) => {
76+
util.testExpressionTemplate`(${value}).toFixed(${frac})`.expectToMatchJsResult();
77+
});
78+
7279
test.each(cases)("isNaN(%p)", value => {
7380
util.testExpressionTemplate`isNaN(${value} as any)`.expectToMatchJsResult();
7481
});

0 commit comments

Comments
 (0)