Forked from HYCAR-Hydro / airGR
Source project has a limited visibility.
base.ts 2.66 KiB
/**
 * Gestion des messages de debogage dans la console
 * @note Implémenter cette interface pour toutes les classes à debugguer
 * Dans le constructeur, utiliser super(true) pour debugger la classe, super(false) sinon.
 */
export interface IDebug {
    readonly DBG: boolean;
    debug(s: any): void;
export class Debug {
    /**
     * @param _DBG Flag de débuggage
    constructor(private _DBG: boolean) { }
    /**
     * Affiche un message dans la console si le flag this.DBG est à true
     * @param s Message à afficher dans la console
    public debug(...args: any[]) {
        // tslint:disable-next-line:no-console
        if (this._DBG) {
            // tslint:disable-next-line:no-console
            console.log(...args);
    get DBG() { return this._DBG; }
/**
 * Méthode simulant l'opérateur booléen xor
 * @see http://www.howtocreate.co.uk/xor.html
export function XOR(a: boolean, b: boolean): boolean {
    return (a || b) && !(a && b);
/**
 * Méthode simulant l'opérateur booléen identité (vrai si a=b)
export function BoolIdentity(a: boolean, b: boolean): boolean {
    return (a && b) || (!a && !b);
/**
 * arrondi d'un nombre avec une précision donnée
 * @param val nombre à arrondir
 * @param prec nombre de chiffres
export function round(val: number, prec: number) {
    const m = Math.pow(10, prec || 0);
    return Math.round(val * m) / m;
export function isNumeric(s: string): boolean {
    if (s !== undefined && s !== null) {
        const trimmed = s.trim();
        return trimmed !== "" && !isNaN(Number(trimmed));
    return false;
/**
 * Retourne true si a et b sont égaux à e près (en gros)
export function isEqual(a: number, b: number, e: number = 1E-7): boolean {
7172737475767778798081828384858687888990919293949596979899100101102103104105
if (a === 0 && b === 0) { return true; } if (b === 0) { // ne pas diviser par 0 [ a, b ] = [ b, a ]; } if (a === 0) { // éviter d'avoir un quotient toujours nul return (Math.abs(b) < e); } // cas général return (Math.abs((a / b) - 1) < e); } /** * Division entière de a par b, plus modulo, avec une tolérance e * pour gérer le cas des nombres réels */ export function floatDivAndMod(a: number, b: number, e: number = 1E-7): { q: number, r: number } { let q = Math.floor(a / b); let r = a % b; // si le modulo est bon à un pouïème, pas de reste if (isEqual(r, b)) { r = 0; // si la division entière n'est pas tombée juste, +1 au quotient if (q !== (a / b)) { q++; } } // si le modulo est nul à un pouïème, il est nul if (isEqual(r, 0)) { r = 0; } return { q, r }; }