﻿function ChrsTo(S, L, C) { // ChrsTo is a new PrfxTo
  for (var i = String(S).length ; i < L ; i++) S = C + S
  return S }

function StrC(X, M, N, B) { var St, J // to M digits point N digits
  St = String(Math.round((B ? Math.abs(X) : X)*Math.pow(10, N)))
  if (X===null || /\D/.test(St)) return ChrsTo(X, M+N+1+B, " ")
  St = ChrsTo(St, M+N, "0") ; J = St.length - N
  return (B ? Sign(X) : "" ) + 
    St.substring(0, J) + "." + St.substring(J) }

function StrU(X, M, N) { return StrC(X, M, N, 0) /* X>-0.5e-N */ }

function Sign(X) { return X>0 ? "" : X<0 ? "-" : "" }

function GetSEM(X) { // returns Sign Mantissa Exponent (base 10)
  var U, Obj = { S : Sign(X), E : 0, M : X==U?U:Math.abs(X) }
  with (Obj) { if (M==0 || !isFinite(M)) return Obj
    while (M >= 10) { E++ ; M /= 10 }
    while (M < 1.0) { E-- ; M *= 10 } }
  return Obj }

function StrSigFigFxd(X, N) { var U // ?? for 2 <= N <= 16 ??
  //if (X==U) return " " + U
  if (X==U) return "";
  if (X == parseInt(X)) return X;
  with (GetSEM(X)) { var P, Q
    P = Math.pow(10, N-E-1) ; Q = Math.round(Math.abs(X)*P)/P
    return S + StrU(Q, 1, Math.max(1, N-E-1)) } }

function beautifyResult($zahl)
{
  $sZahl = "";
  if (!isNaN($zahl)) { $sZahl = $zahl.toString(); } else { $sZahl = $zahl; }
  
  // Wenn kein Dezimalpunkt vorhanden ist, dann nichts weiter machen
  if ($sZahl.indexOf(".") < 0) { return $sZahl; }

  // Wenn das Ergebnis "9.999999999999999e{x}" ist, dann den Rundungsfehler
  // ändern in "1e{x+1}" und nichts weiter machen
  if ($sZahl.indexOf("9.999999999999999e") == 0) {
    $x = parseInt($sZahl.substring(18));
    $x = $x + 1;
    $sZahl = "1e" + $x.toString();
    return $sZahl;
  }

  // Wenn das Ergebnis "{x}.999999999999999" ist, dann den Rundungsfehler
  // aufrunden und nichts weiter machen
  if ($sZahl.indexOf(".999999999999999") > 0 && $sZahl.indexOf("e") < 0) {
    $x = parseInt($sZahl.substring(0, $sZahl.indexOf(".999999999999999")));
    $x = $x + 1;
    $sZahl = $x.toString();
    return $sZahl;
  }                         

  // Wenn das Ergebnis "{x}.99999..." ist und die Differenz zur aufgerundeten Zahl < 0,000001 ist,
  // dann den Rundungsfehler aufrunden und nichts weiter machen
  if ($sZahl.indexOf("e") < 0) {
    $fZahl = parseFloat($sZahl);
    $iZahlAufgerundet = Math.ceil($fZahl);
    if ($iZahlAufgerundet > $fZahl && $iZahlAufgerundet-$fZahl < 0.000001)
    {
      $sZahl = $iZahlAufgerundet.toString();
      return $sZahl;
    }
  }                         

  // Wenn das Ergebnis "0.0000000000{x...}" ist, dann in Exponentialschreibweise umwandeln
  // und nichts weiter machen
  if ($sZahl.indexOf("0.0000000000") == 0 && $sZahl.indexOf("e") < 0) {
    $x = parseFloat($sZahl).toExponential();
    $sZahl = $x.toString();
    return $sZahl;
  }

  // Wenn ein "e" vorhanden ist, dann nichts weiter machen
  if ($sZahl.indexOf("e") > 0) { return $sZahl; }

  // Wenn das Ergebnis "{x}.0000000000000{y}" ist, dann den Rundungsfehler
  // abrunden und nichts weiter machen
  if ($sZahl.indexOf(".0000000000000") > 0 && $sZahl.indexOf("e") < 0) {
    $x = parseInt($sZahl); //.substring(0, $sZahl.indexOf(".0000000000000")+1));
    $sZahl = $x.toString();
    return $sZahl;
  }

  // Dezimalpunkt in Komma für deutsche Zahlenschreibweise ändern
  //$sZahl = $sZahl.replace (/\./, ",");

  // Hinter dem Dezimalkomma Nullen am Ende abschneiden
  $sZahl = $sZahl.replace (new RegExp ('[0]+$'), '');
   
  // falls nur Nullen als Dezimalstellen vorhanden waren und durch das
  // Abschneiden der Nullen jetzt nur das Dezimalkomma am Ende übrig
  // geblieben ist, dann das Dezimalkomma auch noch abschneiden 
  return $sZahl.replace (new RegExp ('[.]+$'), '');
}

// $change: 0 = entferne Exponentialschreibweise
//          1 = benutze Exponentialschreibweise
//          -1 oder andere Werte als 0 oder 1 = keine Änderung
function changeExp($zahl, $change)
{
  // keine Änderung, wenn was anderes als 0 oder 1 für $change übergeben wurde
  if ($change != 0 && $change != 1) { return; }
  
  $fZahl = 1.0;
  if (isNaN($zahl)) { $fZahl = $zahl.parseFloat(); } else { $fZahl = $zahl; }
  
  if ($change == 0) // Exponentialschreibweise entfernen, falls vorhanden
  {
    return $fZahl; // fehlt noch!
  }  
  else if ($change == 1) // Exponentialschreibweise verwenden
  {
    return $fZahl.toExponential();
  }  
}
