Raketenbastler: (hoffentlich) letzte Verbesserungen

Beitrag lesen

Ich hatte, dank der, auch in der Erwachsenenausbildung stattfindenden „Coronaferien“ gerade ein wenig Zeit um damit herumzuspielen… und also dem Skript einen (hoffentlich) letzten Schliff gegeben und die Tests ausgeweitet.

// toCleanNumber.js
class toCleanNumber {

	constructor( decSep = '.' ) {
        this.setNewDecSep( decSep );
	}
	
	setNewDecSep ( decSep ) {
		if ( this.decSep != decSep ) {
			this.search_1 = new RegExp( '&[^;]+;', 'g' );
			this.search_2 = new RegExp( '[^0-9' + decSep + ']' , 'g' );
			this.decSep = decSep;
		}
		if ( '.' != this.decSep ) {
			this.getFloat = function ( s ) {
				if ( isNaN( s ) ) {
					return parseFloat(s.replace( this.search_1, '' ).replace( this.search_2, '' ).replace( this.decSep, '.' ) );
				} else {
					return parseFloat( s );
				}
			}		
		} else {
			this.getFloat = function ( s ) {
				if ( isNaN( s ) ) {
					return parseFloat( s.replace( this.search_1, '' ).replace( this.search_2, '' ) );
				} else {
					return parseFloat( s );
				}
			}
		}
	}
}


/////////////////////////////////////////
//
// Tests: Für Produktivbetrieb entfernen
//
/////////////////////////////////////////

//toCleanNumberTest1();
//toCleanNumberTest2();

//// toCleanNumberTest3( decSep=',', tSep='.', show=false );
//toCleanNumberTest3( '.', ' ', true );
//toCleanNumberTest3( ',', ' ', true );
//toCleanNumberTest3( '.', ' ', false );
//toCleanNumberTest3( ',', ' ', false );
toCleanNumberTest3( ',', ' ', false );
toCleanNumberTest3( '.', ' ', false );
toCleanNumberTest4( ' ', false );

function toCleanNumberTest1() {

	////////////////////////////////
	//
	// Test für "Zahlen" mit Komma:
	//
	////////////////////////////////

	cleaner = new toCleanNumber(',');
	//cleaner.setNewDecSep( ',' );

	s = 123456789;
	i = cleaner.getFloat( s );
	console.log( s + ' : ' + i + ' : ' + typeof( i ) );

	s = '123\u00A0456\u00A0789,123';
	i = cleaner.getFloat( s );
	console.log( s + ' : ' + i + ' : ' + typeof( i ) );

	s = '123 456 789,123';
	i = cleaner.getFloat( s );
	console.log( s + ' : ' + i + ' : ' + typeof( i ) );

	s = '123 456 789,123  ';
	i = cleaner.getFloat( s );
	console.log( s + ' : ' + i + ' : ' + typeof( i ) );
	console.log();
}

function toCleanNumberTest2() {

////////////////////////////////
//
// Test für "Zahlen" mit Punkt:
//
////////////////////////////////

	cleaner = new toCleanNumber(',');
	//cleaner.setNewDecSep( '.' );

	s = 123456789;
	i = cleaner.getFloat( s);
	console.log( s + ' : ' + i + ' : ' + typeof( i ) );

	s = '123\u00A0456\u00A0789.123';
	i = cleaner.getFloat( s );
	console.log( s + ' : ' + i + ' : ' + typeof( i ) );
	s = '123 456 789.123';
	i = cleaner.getFloat( s );

	s = '123 456 789.123  ';
	i = cleaner.getFloat( s );
	console.log( s + ' : ' + i + ' : ' + typeof( i ) );
}

////////////////////////////////
//
// Stresstest
//
////////////////////////////////

function toCleanNumberTest3( decSep = ',', tSep   = '.', show=false ) {

    Imax   = 10;
    Kmax   = 1000;
    LMax   = 100;
    
    arr = new Array();

	for ( let i=0; i < Imax; i++ ) {
		for ( k=0; k < Kmax; k++ ) {
			for ( l=0; l < LMax; l++ ) {
				arr.push( '1' + tSep + i.toString() + tSep + k.toString() + decSep + l.toString() );
			}
		}
	}

    cleaner = new toCleanNumber( decSep );
	startT = Date.now();
	
	arr.forEach( function( s ) {
			z = cleaner.getFloat( s );
			if ( show ) {
				console.log( s + " : " + z  + ' : ' + typeof( z ) );
			}	
	} );
	
	console.log ( 'Mit Klasse/Objekt: ' + ( Imax * Kmax * LMax ).toString()  + ' Strings in ' + ( Date.now() - startT ) + ' Millisekunden konvertiert' );
	//console.log ( cleaner.search_1);
	//console.log ( cleaner.search_2);
}

function toCleanNumberTest4( tSep = ' ', show = false ) {
	
    Imax   = 10;
    Kmax   = 1000;
    LMax   = 100;
    decSep = ','
    
    arr = new Array();

	for ( let i=0; i < Imax; i++ ) {
		for ( k=0; k < Kmax; k++ ) {
			for ( l=0; l < LMax; l++ ) {
				arr.push( i.toString() + tSep + k.toString() + decSep + l.toString() );
			}
		}
	}

	startT = Date.now();
	
	arr.forEach( function( s ) {
			z = s.replace(/\s/g,'').replace(',', '.');
			
			if ( show ) {
				console.log( s + " : " + z  + ' : ' + typeof( z ) );
			}	
	} );
	
	console.log ( 'Einfaches Replace: ' + ( Imax * Kmax * LMax ).toString()  + ' Strings in ' + ( Date.now() - startT ) + ' Millisekunden konvertiert' );
}

Wie Du siehts habe ich bei den Tests zum Vergleich auch Deine Lösung (als 'Einfaches Replace') verbaut:

Hier die Ergebnisse der Stresstest mit nodejs auf dem Desktop:

Mit Klasse/Objekt: 1000000 Strings in 909 Millisekunden konvertiert
Mit Klasse/Objekt: 1000000 Strings in 570 Millisekunden konvertiert
Einfaches Replace: 1000000 Strings in 328 Millisekunden konvertiert

Hier die Ergebnisse der Stresstest mit nodejs auf dem Raspberry Pi 4b+ (hoffentlich vergleichbar mit nicht zu altem Smartphone):

Mit Klasse/Objekt: 1000000 Strings in 3092 Millisekunden konvertiert
Mit Klasse/Objekt: 1000000 Strings in 1798 Millisekunden konvertiert
Einfaches Replace: 1000000 Strings in 824 Millisekunden konvertiert

Du kannst also ggf. auf dieses Skript verweisen und den Hinweis geben, dass bei sehr großen Tabellen auf Smartphones, Tabletts oder alten Rechnern durch die notwendige Umrechnung eine spürbare Verlangsamung eintreten kann - wenn die gezeigte und sehr universelle Klasse statt einer individuellen Ersetzung verwendet wird.

0 47

Regex - Worttrennzeichen

JürgenB
  • javascript
  • regex
  1. 2
    Peter
    1. 0
      JürgenB
  2. 0
    Rolf B
    1. 0
      JürgenB
  3. 0
    Raketenbahnregulator
    1. 0
      JürgenB
      1. 2
        Raketenpilotenausbilder
        1. 0
          JürgenB
          1. 0
            Raketenpilotenausbilder
          2. 0
            Der Martin
            1. 0
              JürgenB
              1. 0
                Gunnar Bittersmann
                • internationalisierung
                1. 0
                  JürgenB
          3. 0
            Gunnar Bittersmann
            • meinung
            1. 0
              Matthias Apsel
              1. 0
                Gunnar Bittersmann
                1. 0
                  JürgenB
                  1. 0
                    Gunnar Bittersmann
                    1. 0
                      JürgenB
                      1. 0
                        Gunnar Bittersmann
                        1. 0
                          JürgenB
                        2. 0
                          Rolf B
                          1. 0
                            Gunnar Bittersmann
                            1. 0
                              Rolf B
                          2. 0
                            JürgenB
    2. 0

      (Verbesserungen)

      Raketeningrid
      1. 0

        (hoffentlich) letzte Verbesserungen

        Raketeningrid
        1. 0
          Rolf B
          1. 2
            Gunnar Bittersmann
            1. 0
              Raketeningrid
              1. 0
                Gunnar Bittersmann
                1. 0
                  JürgenB
                  1. 0
                    Raketenwissenschaftler
                    1. 1
                      Mitleser 2.0
                      1. 0
                        JürgenB
                        1. 0
                          Mitleser 2.0
                          1. 0
                            JürgenB
                            1. 0
                              Raketenwissenschaftler
                              1. 0
                                Raketenbastler
                2. 0
                  Gunnar Bittersmann
          2. 0
            Raketeningrid
            1. 0
              Rolf B
              1. 0
                Raketenwissenschaftler
    3. 0
      MudGuard
      1. 0
        JürgenB
  4. 0
    JürgenB