ํฐ์คํ ๋ฆฌ ๋ทฐ
[JavaScript] Number
๊ฐ๋ฐ๊ฐ๊ตด๐ธ 2022. 8. 2. 17:20ํ์ค ๋นํธ์ธ ๊ฐ์ฒด์ธ Number๋ ์์ ํ์ ์ธ ์ซ์๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
Number ์์ฑ์ ํจ์
ํ์ค ๋นํธ์ธ ๊ฐ์ฒด์ธ Number ๊ฐ์ฒด๋ ์์ฑ์ ํจ์ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ์ฌ Number ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
// 1. ์ธ์ X
const numObj = new Number();
console.log(numObj); // Number {[[PrimitiveValue]]: 0}
// 2. ์ธ์ O
let numObj = new Number(10);
console.log(numObj); // Number {[[PrimitiveValue]]: 10}
numObj = new Number('10');
console.log(numObj); // Number {[[PrimitiveValue]]: 10}
numObj = new Number('Hello');
console.log(numObj); // Number {[[PrimitiveValue]]: NaN}
// ๋ฌธ์์ด ํ์
=> ์ซ์ ํ์
Number('0'); // -> 0
Number('-1'); // -> -1
Number('10.53'); // -> 10.53
// ๋ถ๋ฆฌ์ธ ํ์
=> ์ซ์ ํ์
Number(true); // -> 1
Number(false); // -> 0
- Number ์์ฑ์ ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ์ง ์๊ณ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉด [[NumberData]] ๋ด๋ถ ์ฌ๋กฏ์ 0์ ํ ๋นํ Number ๋ํผ ๊ฐ์ฒด๋ฅผ ์์ฑ
- Number ์์ฑ์ ํจ์์ ์ซ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ฉด์ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉด [[NumberData]] ๋ด๋ถ ์ฌ๋กฏ์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ซ์๋ฅผ ํ ๋นํ Number ๊ฐ์ฒด๋ฅผ ์์ฑ
- Number ์์ฑ์ ํจ์์ ์ซ์๊ฐ ์๋ ์ธ์๋ฅผ ์ ๋ฌํ๋ฉด ์ธ์๋ฅผ ์ซ์๋ก ๊ฐ์ ๋ณํํ ํ, [[NumberData]] ๋ด๋ถ ์ฌ๋กฏ์ ๋ณํ๋ ์ซ์๋ฅผ ํ ๋นํ Number ๊ฐ์ฒด๋ฅผ ์์ฑ
Number ํ๋กํผํฐ
Number.EPSILON
ES6์์ ๋์ ๋ Number.EPSILON์ 1๊ณผ 1๋ณด๋ค ํฐ ์ซ์ ์ค์์ ๊ฐ์ฅ ์์ ์ซ์์์ ์ฐจ์ด์ ๊ฐ์ต๋๋ค. Number.ESPILON์ ์ฝ 2.220446049... x 10^-16์ผ๋ก, ๋ถ๋์์์ ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์ค์ฐจ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
// ๋ถ๋์์์ ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์ค์ฐจ
0.1 + 0.2; // -> 0.30000000000000004
0.1 + 0.2 === 0.3; // -> false
// Number.EPSILON ํ์ฉํด ๋ถ๋์์์ ์ ๋น๊ต
function isEqual(a, b){
// a์ b๋ฅผ ๋บ ๊ฐ์ ์ ๋๊ฐ์ด Number.EPSILON๋ณด๋ค ์์ผ๋ฉด ๊ฐ์ ์๋ก ์ธ์ ํ๋ค.
return Math.abs(a - b) < Number.EPSILON;
}
isEqual(0.1 + 0.2, 0.3); // -> true
Number.MAX_VALUE
์๋ฐ์คํฌ๋ฆฝํธ์์ ํํํ ์ ์๋ ๊ฐ์ฅ ํฐ ์์ ๊ฐ์ผ๋ก, Number.MAX_VALUE๋ณด๋ค ํฐ ์ซ์๋ Infinity์ ๋๋ค.
Number.MAX_VALUE; // -> 1.7976931348623157e+308
Infinity > Number.MAX_VALUE; // -> true
Number.MIN_VALUE
์๋ฐ์คํฌ๋ฆฝํธ์์ ํํํ ์ ์๋ ๊ฐ์ฅ ์์ ์์ ๊ฐ์ผ๋ก, Number.MIN_VALUE๋ณด๋ค ์์ ์ซ์๋ 0์ ๋๋ค.
Number.MIN_VALUE; // -> 5e-324
Number.MIN_VALUE > 0; // -> true
Number.MAX_SAFE_INTEGER
์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ ํ๊ฒ ํํํ ์ ์๋ ๊ฐ์ฅ ํฐ ์ ์๊ฐ์ ๋๋ค.
Number.MAX_SAFE_INTEGER; // -> 9007199254740991
Number.MIN_SAFE_INTEGER
์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ ํ๊ฒ ํํํ ์ ์๋ ๊ฐ์ฅ ์์ ์ ์๊ฐ์ ๋๋ค.
Number.MIN_SAFE_INTEGER; // -> -9007199254740991
Number.POSITIVE_INFINITY
์์ ๋ฌดํ๋๋ฅผ ๋ํ๋ด๋ ์ซ์๊ฐ Infinity์ ๊ฐ์ต๋๋ค.
Number.POSITIVE_INFINITY; // -> Infinity
Number.NEGATIVE_INFINITY
์์ ๋ฌดํ๋๋ฅผ ๋ํ๋ด๋ ์ซ์๊ฐ -Infinity์ ๊ฐ์ต๋๋ค.
Number.NEGATIVE_INFINITY; // -> -Infinity
Number.NaN
์ซ์๊ฐ ์๋(Not-a-Number)์ ํ๋๋ด๋ ์ซ์๊ฐ์ผ๋ก Number.NaN์ window.NaN๊ณผ ๊ฐ์ต๋๋ค.
Number.NaN; // -> NaN
Number ๋ฉ์๋
Number.isFinite
ES6์์ ๋์ ๋ Number.isFinite ์ ์ ๋ฉ์๋๋ ์ธ์๋ก ์ ๋ฌ๋ ์ซ์๊ฐ์ด ์ ์์ ์ธ ์ ํ์, ์ฆ Infinity ๋๋ -Infinity๊ฐ ์๋์ง ๊ฒ์ฌํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ๋ฆฌ์ธ ๊ฐ์ผ๋ก ๋ฐํํฉ๋๋ค.
// 1. ์ ํ์์ธ์ง ๊ฒ์ฌ
// ์ธ์๊ฐ ์ ์์ ์ธ ์ ํ์์ด๋ฉด true๋ฅผ ๋ฐํํ๋ค.
Number.isFinite(0); // -> true
Number.isFinite(Number.MAX_VALUE); // -> true
Number.isFinite(Number.MIN_VALUE); // -> true
// ์ธ์๊ฐ ๋ฌดํ์์ด๋ฉด false๋ฅผ ๋ฐํํ๋ค.
Number.isFinite(Infinity); // -> false
Number.isFinite(-Infinity); // -> false
// 2. NaN์ ์ธ์ ๋ false
Number.isFinite(NaN); // -> false
// 3. Number.isFinite๋ ์ธ์๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์
๋ณํํ์ง ์๋๋ค.
Number.isFinite(null); // -> false
// isFinite๋ ์ธ์๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์
๋ณํํ๋ค. null์ 0์ผ๋ก ์๋ฌต์ ํ์
๋ณํ๋๋ค.
isFinite(null); // -> true
- ๋ง์ฝ ์ธ์๊ฐ NaN์ด๋ฉด ์ธ์ ๋ false๋ฅผ ๋ฐํ
- ์ ๋ฌ๋ฐ์ ์ธ์๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์ ๋ณํํ์ง ์์์ ์ซ์๊ฐ ์๋ ์ธ์๊ฐ ์ฃผ์ด์ง๋ฉด ์ธ์ ๋ false๋ฅผ ๋ฐํ
Number.isInteger
ES6์์ ๋์ ๋ Number.isInteger ์ ์ ๋ฉ์๋๋ ์ธ์๋ก ์ ๋ฌ๋ ์ซ์๊ฐ์ด ์ ์์ธ์ง ๊ฒ์ฌํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ๋ฆฌ์ธ ๊ฐ์ผ๋ก ๋ฐํํฉ๋๋ค. ๊ฒ์ฌํ๊ธฐ ์ ์ ์ธ์๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์ ๋ณํํ์ง ์์ต๋๋ค.
// ์ธ์๊ฐ ์ ์์ด๋ฉด true๋ฅผ ๋ฐํํ๋ค.
Number.isInteger(0) // -> true
Number.isInteger(123) // -> true
Number.isInteger(-123) // -> true
// 0.5๋ ์ ์๊ฐ ์๋๋ค.
Number.isInteger(0.5) // -> false
// '123'์ ์ซ์๋ก ์๋ฌต์ ํ์
๋ณํํ์ง ์๋๋ค.
Number.isInteger('123') // -> false
// false๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์
๋ณํํ์ง ์๋๋ค.
Number.isInteger(false) // -> false
// Infinity/-Infinity๋ ์ ์๊ฐ ์๋๋ค.
Number.isInteger(Infinity) // -> false
Number.isInteger(-Infinity) // -> false
Number.isNaN
ES6์์ ๋์ ๋ Number.isNaN ์ ์ ๋ฉ์๋๋ ์ธ์๋ก ์ ๋ฌ๋ ์ซ์๊ฐ์ด NaN์ธ์ง ๊ฒ์ฌํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ๋ฆฌ์ธ ๊ฐ์ผ๋ก ๋ฐํํฉ๋๋ค. Number.isNaN ๋ฉ์๋๋ ์ ๋ฌ๋ฐ์ ์ธ์๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์ ๋ณํํ์ง ์์ต๋๋ค.
// ์ธ์๊ฐ NaN์ด๋ฉด true๋ฅผ ๋ฐํํ๋ค.
Number.isNaN(NaN); // -> true
// Number.isNaN์ ์ธ์๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์
๋ณํํ์ง ์๋๋ค.
Number.isNaN(undefined); // -> false
// isFinite๋ ์ธ์๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์
๋ณํํ๋ค. undefined๋ NaN์ผ๋ก ์๋ฌต์ ํ์
๋ณํ๋๋ค.
isNaN(undefined); // -> true
Number.isSafeInteger
ES6์์ ๋์ ๋ Number.isSafeInteger ์ ์ ๋ฉ์๋๋ ์ธ์๋ก ์ ๋ฌ๋ ์ซ์๊ฐ์ด ์์ ํ ์ ์(-(2^53-1) ~ 2^53-1)์ธ์ง ๊ฒ์ฌํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ๋ฆฌ์ธ ๊ฐ์ผ๋ก ๋ฐํํฉ๋๋ค. Number.isSafeInteger ๋ฉ์๋๋ ์ ๋ฌ๋ฐ์ ์ธ์๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์ ๋ณํํ์ง ์์ต๋๋ค.
// 0์ ์์ ํ ์ ์์ด๋ค.
Number.isSafeInteger(0); // -> true
// 1000000000000000์ ์์ ํ ์ ์์ด๋ค.
Number.isSafeInteger(1000000000000000); // -> true
// 10000000000000001์ ์์ ํ์ง ์๋ค.
Number.isSafeInteger(10000000000000001); // -> false
// 0.5์ ์ ์๊ฐ ์๋๋ค.
Number.isSafeInteger(0.5); // -> false
// '123'์ ์ซ์๋ก ์๋ฌต์ ํ์
๋ณํํ์ง ์๋๋ค.
Number.isSafeInteger('123'); // -> false
// false๋ฅผ ์ซ์๋ก ์๋ฌต์ ํ์
๋ณํํ์ง ์๋๋ค.
Number.isSafeInteger(false); // -> false
// Infinity/-Infinity๋ ์ ์๊ฐ ์๋๋ค.
Number.isSafeInteger(Infinity); // -> false
Number.prototype.toExponential
toExponential ๋ฉ์๋๋ ์ซ์๋ฅผ ์ง์ ํ๊ธฐ๋ฒ์ผ๋ก ๋ณํํ์ฌ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. ์ง์ ํ๊ธฐ๋ฒ์ด๋ ๋งค์ฐ ํฌ๊ฑฐ๋ ์์ ์ซ์๋ฅผ ํ๊ธฐํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ฉฐ e(Exponent) ์์ ์๋ ์ซ์์ 10์ n์น์ ๊ณฑํ๋ ํ์์ผ๋ก ์๋ฅผ ๋ํ๋ด๋ ๋ฐฉ์์ ๋๋ค.
// 1. ์ธ์๋ก ์์์ ์ดํ๋ก ํํํ ์๋ฆฟ์๋ฅผ ์ ๋ฌ ๊ฐ๋ฅ
(77.1234).toExponential(); // -> "7.71234e+1"
(77.1234).toExponential(4); // -> "7.7123e+1"
(77.1234).toExponential(2); // -> "7.71e+1"
// 2. ์ซ์ ๋ฆฌํฐ๋ด๊ณผ ํจ๊ป Number ํ๋กํ ํ์
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฌ ๋ฐ์
77.toExponential(); // -> SyntaxError: Invalid or unexpected token
// ์ซ์ ๋ฆฌํฐ๋ด๊ณผ ํจ๊ป ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ทธ๋ฃน ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผํจ
77.1234.toExponential(); // -> "7.71234e+1"
(77).toExponential(); // -> "7.7e+1"
// 3. ์ซ์ ๋ค์ .๋ค์ ๊ณต๋ฐฑ์ด ์ค๋ฉด .์ ํ๋กํผํฐ ์ ๊ทผ ์ฐ์ฐ์๋ก ํด์ํจ
77 .toExponential(); // -> "7.7e+1"
- ์ธ์๋ก ์์์ ์ดํ๋ก ํํํ ์๋ฆฟ์๋ฅผ ์ ๋ฌ ํ ์ ์์
- ์ซ์ ๋ฆฌํฐ๋ด๊ณผ ํจ๊ป Number ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์
- ์ซ์ ๋ฆฌํฐ๋ด๊ณผ ํจ๊ป ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ํผ๋ ๋ฐฉ์ง๋ฅผ ์ํด ๊ทธ๋ฃน ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํจ
- ์ซ์ ๋ค์ . ๋ค์ ๊ณต๋ฐฑ์ด ์ค๋ฉด . ์ ํ๋กํผํฐ ์ ๊ทผ ์ฐ์ฐ์๋ก ํด์ํจ
Number.prototype.toFixed
toFixed ๋ฉ์๋๋ ์ซ์๋ฅผ ๋ฐ์ฌ๋ฆผํ์ฌ ๋ฌธ์์ด๋ก ๋ฐํํฉ๋๋ค. ๋ฐ์ฌ๋ฆผํ๋ ์์์ ์ดํ ์๋ฆฟ์๋ฅผ ๋ํ๋ด๋ 0~20 ์ฌ์ด์ ์ ์๊ฐ์ ์ธ์๋ก ์ ๋ฌํ ์ ์๊ณ ์ธ์๋ฅผ ์๋ตํ๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ 0์ด ์ง์ ๋ฉ๋๋ค.
// ์์์ ์ดํ ๋ฐ์ฌ๋ฆผ. ์ธ์๋ฅผ ์๋ตํ๋ฉด ๊ธฐ๋ณธ๊ฐ 0์ด ์ง์ ๋๋ค.
(12345.6789).toFixed(); // -> "12346"
// ์์์ ์ดํ 1์๋ฆฌ์ ์ ํจ, ๋๋จธ์ง ๋ฐ์ฌ๋ฆผ
(12345.6789).toFixed(1); // -> "12345.7"
// ์์์ ์ดํ 2์๋ฆฌ์ ์ ํจ, ๋๋จธ์ง ๋ฐ์ฌ๋ฆผ
(12345.6789).toFixed(2); // -> "12345.68"
// ์์์ ์ดํ 3์๋ฆฌ์ ์ ํจ, ๋๋จธ์ง ๋ฐ์ฌ๋ฆผ
(12345.6789).toFixed(3); // -> "12345.679"
Number.prototype.toPrecision
toPrecision ๋ฉ์๋๋ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ ์ฒด ์๋ฆฟ์๊น์ง ์ ํจํ๋๋ก ๋๋จธ์ง ์๋ฆฟ์๋ฅผ ๋ฐ์ฌ๋ฆผํ์ฌ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ ์ฒด ์๋ฆฟ์๋ก ํํํ ์ ์๋ ๊ฒฝ์ฐ ์ง์ ํ๊ธฐ๋ฒ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
์ ์ฒด ์์ง์๋ฅผ ๋ํ๋ด๋ 0~21 ์ฌ์ด์ ์ ์๊ฐ์ ์ธ์๋ก ์ ๋ฌํ ์ ์์ผ๋ฉฐ ์ธ์๋ฅผ ์๋ตํ๋ฉด ๊ธฐ๋ณธ๊ฐ 0์ด ์ง์ ๋ฉ๋๋ค.
// ์ ์ฒด ์๋ฆฌ์ ์ ํจ. ์ธ์๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ 0์ด ์ ๋ฌ๋๋ค.
(12345.6789).toPrecision(); // -> "12345.6789"
// ์ ์ฒด 1์๋ฆฌ์ ์ ํจ, ๋๋จธ์ง ๋ฐ์ฌ๋ฆผ
(12345.6789).toPrecision(1); // -> "1e+4"
// ์ ์ฒด 2์๋ฆฌ์ ์ ํจ, ๋๋จธ์ง ๋ฐ์ฌ๋ฆผ
(12345.6789).toPrecision(2); // -> "1.2e+4"
// ์ ์ฒด 6์๋ฆฌ์ ์ ํจ, ๋๋จธ์ง ๋ฐ์ฌ๋ฆผ
(12345.6789).toPrecision(6); // -> "12345.7"
Number.prototype.toString
toString ๋ฉ์๋๋ ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๋ฐํํฉ๋๋ค. ์ง๋ฒ์ ๋ํ๋ด๋ 2~36 ์ฌ์ด์ ์ ์๊ฐ์ ์ธ์๋ก ์ ๋ฌํ ์ ์์ผ๋ฉฐ ์ธ์๋ฅผ ์๋ตํ๋ฉด ๊ธฐ๋ณธ๊ฐ 10์ง๋ฒ์ด ์ง์ ๋ฉ๋๋ค.
// ์ธ์๋ฅผ ์๋ตํ๋ฉด 10์ง์ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
(10).toString(); // -> "10"
// 2์ง์ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
(16).toString(2); // -> "10000"
// 8์ง์ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
(16).toString(8); // -> "20"
// 16์ง์ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
(16).toString(16); // -> "10"
[์ถ์ฒ] ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'JavaScript > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] Date (0) | 2022.08.02 |
---|---|
[JavaScript] Math (0) | 2022.08.02 |
[JavaScript] ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด ๋ฉ์๋์ ๊ณ ์ฐจ ํจ์ (0) | 2022.08.01 |
[JavaScript] ๋ฐฐ์ด (0) | 2022.07.31 |
[JavaScript] ES6 ํจ์์ ์ถ๊ฐ ๊ธฐ๋ฅ (0) | 2022.07.29 |
- Total
- Today
- Yesterday
- ์ด์์ฒด์
- Baekjoon
- TDD
- ์๋ฐ
- ๋ฐฑ์ค javascript
- ์ฝ๋ฉํ ์คํธ
- http
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฑ์ค node.js
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- git
- ์นด์นด์ค ์ธํด
- ์ด๋ถํ์
- ๋์์ธ ํจํด
- JavaScript
- ํ๋กํ ์ฝ
- ํ๋กํผํฐ
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ์๋ฐ์คํฌ๋ฆฝํธ
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- ๋คํธ์ํฌ
- ๋ ์์ปฌ ํ๊ฒฝ
- fp
- ํ๋ก๊ทธ๋๋จธ์ค
- map
- ๋ฐฑ์ค
- ํฌํฌ์ธํฐ
- ์ ์ญ ๋ณ์
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |