45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
export function capitalize(name: string) {
|
|
return name.charAt(0).toUpperCase() + name.slice(1);
|
|
}
|
|
|
|
// Cleans raw input into a valid numeric string:
|
|
// - Single non-alphabetic separator between digits (commas, spaces, underscores) → stripped
|
|
// - Alphabetic characters → stop processing
|
|
// - 2+ consecutive non-digit characters → stop processing
|
|
// - First decimal point preserved, subsequent dots stripped
|
|
export function cleanNumericInput(raw: string): string {
|
|
raw = raw.trim();
|
|
let result = "";
|
|
let hasDecimal = false;
|
|
let i = 0;
|
|
while (i < raw.length) {
|
|
const ch = raw[i];
|
|
if (/\d/.test(ch)) {
|
|
result += ch;
|
|
i++;
|
|
} else if (ch === "." && !hasDecimal) {
|
|
result += ch;
|
|
hasDecimal = true;
|
|
i++;
|
|
} else if (/[a-zA-Z]/.test(ch)) {
|
|
break;
|
|
} else {
|
|
// Non-alphabetic, non-digit character (comma, space, extra dot, etc.)
|
|
// Accept only if it's a single separator followed by a digit
|
|
if (i + 1 < raw.length && /\d/.test(raw[i + 1])) {
|
|
i++; // skip the separator
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
export function formatBytes(bytes: number): string {
|
|
if (!Number.isFinite(bytes) || bytes <= 0) return "0 B";
|
|
const k = 1024;
|
|
const sizes = ["B", "KB", "MB", "GB", "TB"];
|
|
const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);
|
|
return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
|
|
} |