bitburner-src/utils/StringHelperFunctions.ts

115 lines
3.9 KiB
TypeScript
Raw Normal View History

import { EqualityFunc } from "../src/types";
import { isString } from "./helpers/isString";
2018-06-25 02:55:43 +02:00
// Netburner String helper functions
2018-06-25 02:55:43 +02:00
// Replaces the character at an index with a new character
2018-06-22 23:30:24 +02:00
function replaceAt(base: string, index: number, character: string): string {
2018-06-25 02:55:43 +02:00
return base.substr(0, index) + character + base.substr(index + character.length);
2017-02-06 06:01:01 +01:00
}
2018-06-25 02:55:43 +02:00
/*
Converts a date representing time in milliseconds to a string with the format H hours M minutes and S seconds
2019-02-09 03:46:30 +01:00
e.g. 10000 -> "10 seconds"
120000 -> "2 minutes and 0 seconds"
2018-06-25 02:55:43 +02:00
*/
function convertTimeMsToTimeElapsedString(time: number, showMilli=false): string {
time = Math.floor(time);
2021-04-30 05:52:56 +02:00
const millisecondsPerSecond = 1000;
const secondPerMinute = 60;
const minutesPerHours = 60;
2018-06-25 02:55:43 +02:00
const secondPerHours: number = secondPerMinute * minutesPerHours;
2021-04-30 05:52:56 +02:00
const hoursPerDays = 24;
2018-06-25 02:55:43 +02:00
const secondPerDay: number = secondPerHours * hoursPerDays;
// Convert ms to seconds, since we only have second-level precision
const totalSeconds: number = Math.floor(time / millisecondsPerSecond);
2018-06-25 02:55:43 +02:00
const days: number = Math.floor(totalSeconds / secondPerDay);
const secTruncDays: number = totalSeconds % secondPerDay;
2018-06-25 02:55:43 +02:00
const hours: number = Math.floor(secTruncDays / secondPerHours);
const secTruncHours: number = secTruncDays % secondPerHours;
2018-06-25 02:55:43 +02:00
const minutes: number = Math.floor(secTruncHours / secondPerMinute);
const secTruncMinutes: number = secTruncHours % secondPerMinute;
const milliTruncSec: string = (() => {
2021-05-03 23:24:39 +02:00
let str = `${time % millisecondsPerSecond}`;
while(str.length < 3) str = "0"+str;
return str;
})()
const seconds: string = showMilli ? `${secTruncMinutes}.${milliTruncSec}` : `${secTruncMinutes}`;
2021-04-30 05:52:56 +02:00
let res = "";
if (days > 0) {res += `${days} days `; }
if (hours > 0) {res += `${hours} hours `; }
if (minutes > 0) {res += `${minutes} minutes `; }
res += `${seconds} seconds`;
2018-06-25 02:55:43 +02:00
return res;
}
2018-06-25 02:55:43 +02:00
// Finds the longest common starting substring in a set of strings
2018-06-22 23:30:24 +02:00
function longestCommonStart(strings: string[]): string {
2018-06-25 02:55:43 +02:00
if (!containsAllStrings(strings)) {return ""; }
if (strings.length === 0) {return ""; }
2018-06-25 02:55:43 +02:00
2018-07-04 05:50:25 +02:00
const A: string[] = strings.concat()
.sort();
2018-06-25 02:55:43 +02:00
const a1: string = A[0];
const a2: string = A[A.length - 1];
const L: number = a1.length;
2021-04-30 05:52:56 +02:00
let i = 0;
const areEqualCaseInsensitive: EqualityFunc<string> = (a: string, b: string) => a.toUpperCase() === b.toUpperCase();
while (i < L && areEqualCaseInsensitive(a1.charAt(i), a2.charAt(i))) {
i++;
}
2018-06-25 02:55:43 +02:00
return a1.substring(0, i);
}
2018-06-25 02:55:43 +02:00
// Returns whether an array contains entirely of string objects
2018-06-22 23:30:24 +02:00
function containsAllStrings(arr: string[]): boolean {
return arr.every(isString);
}
2018-06-25 02:55:43 +02:00
// Formats a number with commas and a specific number of decimal digits
2018-06-22 23:30:24 +02:00
function formatNumber(num: number, numFractionDigits: number): string {
return num.toLocaleString(undefined, {
2018-06-25 02:55:43 +02:00
maximumFractionDigits: numFractionDigits,
minimumFractionDigits: numFractionDigits,
});
}
2018-06-25 02:55:43 +02:00
// Checks if a string contains HTML elements
2018-06-22 23:30:24 +02:00
function isHTML(str: string): boolean {
const element: HTMLDivElement = document.createElement("div");
element.innerHTML = str;
const c: NodeListOf<Node & ChildNode> = element.childNodes;
2018-07-04 05:50:25 +02:00
for (let i: number = c.length - 1; i >= 0; i--) {
if (c[i].nodeType === 1) {
return true;
}
2017-09-15 16:06:59 +02:00
}
2018-06-25 02:55:43 +02:00
2017-09-15 16:06:59 +02:00
return false;
}
2018-06-25 02:55:43 +02:00
// Generates a random alphanumeric string with N characters
2018-06-22 23:30:24 +02:00
function generateRandomString(n: number): string {
2021-04-30 05:52:56 +02:00
let str = "";
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
2021-04-30 05:52:56 +02:00
for (let i = 0; i < n; i++) {
str += chars.charAt(Math.floor(Math.random() * chars.length));
2018-06-25 02:55:43 +02:00
}
return str;
}
2018-06-25 02:55:43 +02:00
export {convertTimeMsToTimeElapsedString, longestCommonStart,
containsAllStrings, formatNumber,
isHTML, generateRandomString, replaceAt};