{"ScriptPreparationCode":"// Intl.NumberFormat \uAE30\uBC18 \uAD6C\uD604 \r\nfunction commaizeNumberIntl(value) {\r\n const num = typeof value === \u0027string\u0027 ? parseFloat(value.replace(/,/g, \u0027\u0027)) : value;\r\n\r\n if (isNaN(num)) {\r\n return String(value);\r\n }\r\n\r\n return getNumberFormatter(\u0027ko-KR\u0027).format(num);\r\n}\r\n\r\n/**\r\n * locale \uBB38\uC790\uC5F4\uC744 key \uB85C \uC4F0\uB294 \uCE90\uC2DC.\r\n */\r\nconst numberFormatterCache = new Map();\r\n\r\nfunction getNumberFormatter(locale) {\r\n const key = locale;\r\n\r\n let formatter = numberFormatterCache.get(key);\r\n if (!formatter) {\r\n formatter = new Intl.NumberFormat(locale);\r\n numberFormatterCache.set(key, formatter);\r\n }\r\n return formatter;\r\n}\r\n\r\n\r\n// \uC815\uADDC\uC2DD \uAE30\uBC18 \uAD6C\uD604 \r\nfunction commaizeNumberRegex(value) {\r\n const numStr = String(value);\r\n const decimalPointIndex = numStr.indexOf(\u0027.\u0027);\r\n const commaizeRegExp = /(\\d)(?=(\\d\\d\\d)\u002B(?!\\d))/g;\r\n\r\n return decimalPointIndex \u003E -1 ?\r\n numStr.slice(0, decimalPointIndex).replace(commaizeRegExp, \u0027$1,\u0027) \u002B numStr.slice(decimalPointIndex) :\r\n numStr.replace(commaizeRegExp, \u0027$1,\u0027);\r\n}\r\n\r\n// \uD14C\uC2A4\uD2B8 \uB370\uC774\uD130 \uC900\uBE44\r\nconst testNumbers = [\r\n 1234,\r\n 123456,\r\n 123456789,\r\n 1234567890123,\r\n 1234.56,\r\n 123456.789,\r\n 0,\r\n -123456,\r\n 999999999999999,\r\n // \uADF9\uD55C \uCF00\uC774\uC2A4\r\n Number.MAX_SAFE_INTEGER,\r\n Math.PI * 1000000,\r\n // \uBB38\uC790\uC5F4 \uC785\uB825\r\n \u0022123456\u0022,\r\n \u0022999999.99\u0022\r\n];\r\n\r\nconst randomNumbers = [];\r\nfor (let i = 0; i \u003C 1000; i\u002B\u002B) {\r\n randomNumbers.push(Math.floor(Math.random() * 1000000000));\r\n}","TestCases":[{"Name":"Test Case 1: Intl (\uC791\uC740 \uC22B\uC790)","Code":"for (let i = 0; i \u003C 100; i\u002B\u002B) {\r\n commaizeNumberIntl(1234);\r\n}","IsDeferred":false},{"Name":"Test Case 2: RegExp (\uC791\uC740 \uC22B\uC790)","Code":"for (let i = 0; i \u003C 100; i\u002B\u002B) {\r\n commaizeNumberRegex(1234);\r\n}","IsDeferred":false},{"Name":"Test Case 3: Intl (\uD070 \uC22B\uC790)","Code":"for (let i = 0; i \u003C 100; i\u002B\u002B) {\r\n commaizeNumberIntl(123456789012345);\r\n}","IsDeferred":false},{"Name":"Test Case 4: RegExp (\uD070 \uC22B\uC790)","Code":"for (let i = 0; i \u003C 100; i\u002B\u002B) {\r\n commaizeNumberRegex(123456789012345);\r\n}","IsDeferred":false},{"Name":"Test Case 5: Intl (\uC18C\uC218\uC810 \uD3EC\uD568)","Code":"for (let i = 0; i \u003C 100; i\u002B\u002B) {\r\n commaizeNumberIntl(123456.789);\r\n}","IsDeferred":false},{"Name":"Test Case 6: RegExp (\uC18C\uC218\uC810 \uD3EC\uD568)","Code":"for (let i = 0; i \u003C 100; i\u002B\u002B) {\r\n commaizeNumberRegex(123456.789);\r\n}","IsDeferred":false},{"Name":"Test Case 7: Intl (\uD63C\uD569 \uB370\uC774\uD130)","Code":"for (let i = 0; i \u003C testNumbers.length; i\u002B\u002B) {\r\n commaizeNumberIntl(testNumbers[i]);\r\n}","IsDeferred":false},{"Name":"Test Case 8: RegExp (\uD63C\uD569 \uB370\uC774\uD130)","Code":"for (let i = 0; i \u003C testNumbers.length; i\u002B\u002B) {\r\n commaizeNumberRegex(testNumbers[i]);\r\n}","IsDeferred":false},{"Name":"Test Case 9: Intl (\uB79C\uB364 \uB300\uB7C9 \uB370\uC774\uD130)","Code":"for (let i = 0; i \u003C randomNumbers.length; i\u002B\u002B) {\r\n commaizeNumberIntl(randomNumbers[i]);\r\n}","IsDeferred":false},{"Name":"Test Case 10: RegExp (\uB79C\uB364 \uB300\uB7C9 \uB370\uC774\uD130)","Code":"for (let i = 0; i \u003C randomNumbers.length; i\u002B\u002B) {\r\n commaizeNumberRegex(randomNumbers[i]);\r\n}","IsDeferred":false},{"Name":"Test Case 11: Intl (\uBB38\uC790\uC5F4 \uC785\uB825)","Code":"for (let i = 0; i \u003C 100; i\u002B\u002B) {\r\n commaizeNumberIntl(\u0022123456.789\u0022);\r\n}","IsDeferred":false},{"Name":"Test Case 12: RegExp (\uBB38\uC790\uC5F4 \uC785\uB825)","Code":"for (let i = 0; i \u003C 100; i\u002B\u002B) {\r\n commaizeNumberRegex(\u0022123456.789\u0022);\r\n}","IsDeferred":false}]}