Skip to content

Commit b7c49a4

Browse files
committed
add format patern
1 parent 4c22770 commit b7c49a4

1 file changed

Lines changed: 37 additions & 5 deletions

File tree

src/Converter.ts

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,40 @@ export class Converter {
188188
return Math.max(input, max);
189189
}
190190

191-
static FormatPattern(value: string, pattern: string) {
192-
//TODO...
193-
return value;
194-
}
195-
}
191+
static FormatPattern(value: unknown, pattern: string) {
192+
const numberValue = Number(value);
193+
if (Number.isNaN(numberValue))
194+
return String(value ?? "");
195+
196+
const formatMatch = /[0#,.]+/.exec(pattern);
197+
if (formatMatch == null)
198+
return String(value ?? "");
199+
200+
const format = formatMatch[0];
201+
const decimalIndex = format.indexOf(".");
202+
const integerPattern = decimalIndex === -1 ? format : format.substring(0, decimalIndex);
203+
const fractionPattern = decimalIndex === -1 ? "" : format.substring(decimalIndex + 1);
204+
const useThousandsSeparator = integerPattern.includes(",");
205+
const integerDigits = integerPattern.replace(/,/g, "");
206+
const minimumIntegerDigits = [...integerDigits].filter(x => x === "0").length;
207+
const maximumFractionDigits = fractionPattern.length;
208+
const minimumFractionDigits = [...fractionPattern].filter(x => x === "0").length;
209+
210+
const fixedValue = Math.abs(numberValue).toFixed(maximumFractionDigits);
211+
let [integerPart, fractionPart = ""] = fixedValue.split(".");
212+
integerPart = integerPart.padStart(minimumIntegerDigits, "0");
213+
214+
if (useThousandsSeparator)
215+
integerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
216+
217+
if (fractionPart.length > minimumFractionDigits)
218+
fractionPart = fractionPart.replace(/0+$/g, "");
219+
220+
while (fractionPart.length < minimumFractionDigits)
221+
fractionPart += "0";
222+
223+
const sign = numberValue < 0 ? "-" : "";
224+
const formattedValue = sign + integerPart + (fractionPart ? "." + fractionPart : "");
225+
return pattern.substring(0, formatMatch.index) + formattedValue + pattern.substring(formatMatch.index + format.length);
226+
}
227+
}

0 commit comments

Comments
 (0)