{"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// Test Case A: \uC77C\uBC18 \uD398\uC774\uC9C0 (8\uAC1C \uC22B\uC790 \uD55C\uBC88\uC5D0 \uCC98\uB9AC)\r\nconst normalPageNumbers = [1234, 56789, 123456, 9876, 543210, 87654, 321098, 765432];\r\n\r\n// Test Case B: Virtual scroll (30\uAC1C \uD55C\uBC88\uC5D0 \uCC98\uB9AC) \r\nconst virtualScrollNumbers = Array.from({length: 30}, (_, i) =\u003E Math.floor(Math.random() * 10000000));\r\n\r\n// Test Case C: \uC8FC\uC2DD \uC11C\uBE44\uC2A4 \uC5C5\uB370\uC774\uD2B8 (100\uAC1C \uD55C\uBC88\uC5D0 \uCC98\uB9AC)\r\nconst stockNumbers = Array.from({length: 100}, (_, i) =\u003E Math.floor(Math.random() * 1000000000));\r\n","TestCases":[{"Name":"1. Intl \uC77C\uBC18\uC801\uC778 \uCF00\uC774\uC2A4 (8\uAC1C \uC22B\uC790 \uD55C\uBC88\uC5D0 \uCC98\uB9AC)","Code":" for (const num of normalPageNumbers) {\r\n commaizeNumberIntl(num);\r\n }","IsDeferred":false},{"Name":"2. Regex \uC77C\uBC18\uC801\uC778 \uCF00\uC774\uC2A4 (8\uAC1C \uC22B\uC790 \uD55C\uBC88\uC5D0 \uCC98\uB9AC)","Code":"for (const num of normalPageNumbers) {\r\n commaizeNumberRegex(num);\r\n }","IsDeferred":false},{"Name":"3. Intl Virtual scroll \uCF00\uC774\uC2A4 (30\uAC1C \uD55C\uBC88\uC5D0 \uCC98\uB9AC) ","Code":" for (const num of virtualScrollNumbers) {\r\n commaizeNumberIntl(num);\r\n }","IsDeferred":false},{"Name":"4. Regex Virtual scroll \uCF00\uC774\uC2A4 (30\uAC1C \uD55C\uBC88\uC5D0 \uCC98\uB9AC) ","Code":"for (const num of virtualScrollNumbers) {\r\n commaizeNumberRegex(num);\r\n }","IsDeferred":false},{"Name":"5. Intl \uC804\uCCB4 \uB9AC\uC2A4\uD2B8 \uCF00\uC774\uC2A4 (100\uAC1C \uD55C\uBC88\uC5D0 \uCC98\uB9AC)","Code":"for (const num of stockNumbers) {\r\n commaizeNumberIntl(num);\r\n }","IsDeferred":false},{"Name":"6. Regex \uC804\uCCB4 \uB9AC\uC2A4\uD2B8 \uCF00\uC774\uC2A4 (100\uAC1C \uD55C\uBC88\uC5D0 \uCC98\uB9AC)","Code":" for (const num of stockNumbers) {\r\n commaizeNumberRegex(num);\r\n }","IsDeferred":false}]}