2009-03-18 13 views
8

Was ist der beste Weg, um Dezimalzahlen (Basis zehn) in sexagesimal (Basis sechzig) als eine Zeichenfolge mit 0-9, A-Z und a-x als Ziffern dargestellt zu konvertieren.Konvertieren von Dezimalzahlen in sexagesimal (Basis sechzig) in JavaScript

Ich plane, es in Javascript zu kodieren, aber jede Hilfe wird geschätzt.

Verwendungsbeispiel:

>>decToSex(60); 
"10" 
>>decToSex(123); 
"23" 
>>decToSex(1000000); 
"4bke" 
>>decToSex(1234567.89); 
"5gu7.rO" 

Der endgültige Code I, bezogen auf Paolo Antwort:

var decToSex = function(){ 
    var decToSexMap = ['0','1','2','3','4','5','6','7','8','9', 
      'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 
      'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x']; 

    return function(number){ 

     var negative = ''; 
     if (number < 0){ 
      var negative = '-'; 
     } 

     number = number.toString().split('.'); 
     var integer = Math.abs(number[0]); 
     var fraction = number[1]; 
     var result = ''; 

     do { 
      result = decToSexMap[integer % 60] + result; 
      integer = parseInt(integer/60); 
     } while (integer > 0); 

     if (fraction){ 
      var decimalPlaces = fraction.toString().length; 
      result += '.'; 
      fraction = parseFloat('.' + fraction); 

      var x = 0; 
      do { 
       x++; 
       var res = (fraction * 60).toString().split('.'); 
       result = result + decToSexMap[res[0]]; 

       if (res[1]) { 
        fraction = parseFloat('.' + res[1]); 
       } 
       else { 
        break; 
       } 
      } while (x < decimalPlaces); 
     } 
     return negative + result; 
    } 
}(); 
+2

Nizza Funktionsnamen, aber leider Sex - bedeutet 6, nicht 60 :-( – derobert

+0

oh, dann muss ich mir eine Alternative überlegen. Vielleicht Sexage, wie der Sexage-nary-Zyklus es benutzt? – Annan

+0

Mein Kopf tut weh von all dem Mathe, aber ich denke meine Antwort macht den Trick –

Antwort

2

Dies funktioniert mit den Testdaten zur Verfügung gestellt, aber Sie wollen wahrscheinlich ein paar mehr Tests darauf laufen:

<script> 
var convert = new Array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K', 
         'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a', 
         'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q', 
         'r','s','t','u','v','w','x'); 

function decToSex(num) { 
    var extract = num.toString().split('.'); 
    num = extract[0]; 
    var pieces = new Array(); 
    do { 
     pieces.push(convert[num % 60]); 
     num = parseInt(num/60); 
    } while (num > 0); 
    pieces = pieces.reverse(); 
    var rem = extract[1]; 
    if(rem) { 
     rem = parseFloat('.' + rem); 
     var x = 0; 
     var dec = new Array(); 
     do { 
      x++; 
      var res = (rem * 60).toString().split('.'); 
      dec.push(convert[res[0]]); 
      if(res[1]) { 
       rem = parseFloat('.' + res[1]); 
      } else { 
       break; 
      } 
     } while (x < 3); // work up to 3 decimal places, change for more. 
    } 
    var myResult = pieces.join(''); 
    if(dec) { 
     myResult += '.' + dec.join(''); 
    } 
    return myResult; 
} 

alert(decToSex(60)); 
alert(decToSex(123)); 
alert(decToSex(1000000)); 
alert(decToSex(1234567.89)); 
</script> 
0

Gerade wiederholt teilen sie durch 60, bis Sie mit Null sind links. Nehmen Sie jedes Mal den Modulus und konvertieren Sie ihn in das entsprechende Zeichen und fügen Sie ihn zu Ihrer Ausgabezeichenfolge hinzu.

Edit: Für Dezimalzahlen, sagen Sie suchen bis 3 60decimal Plätze nach oben:

Beginnen Sie mit 0,98765 (Basis 10)

0.98765 * 60 -> 59.259 -> first post-decimal character is 59 converted to its 60decimal character, then carry the .259 
.259 * 60 -> 15.54 -> second char is 15 converted to its 60decimal character, then carry the .54 
.54 * 60 -> 32.4 -> round it this time (its the last char) -> last char is 32 as its 60dec char 

So 0,98765 (Basis 10) 0. [59] wird [15] [32] (Basis 60)

+0

Wie würde das mit Brüchen funktionieren: 1234567.89 -> "5gu7.rO"? – Annan

+0

Sie müssten zuerst angeben, wie viele Dezimalstellen ausgewertet werden sollen, und dann von dort aus arbeiten. – Chris

+0

Probieren Sie meine Bearbeitung oben auf einem Stück Papier aus ... – Chris

0

starten, indem die Zahl in eine ganze Zahl Aufspalten und Bruchteil.

Für den ganzzahligen Teil, nehmen Sie den Modulus zum Ziehen der niedrigstwertigen Stelle, dann dividieren Sie durch 60 und wiederholen.

Für den Bruchteil wiederholt mit 60 multiplizieren und den ganzzahligen Teil nehmen, um die Ergebnisziffern zu erhalten. Wenn Sie jemals mit Null enden, was unwahrscheinlich ist, sind Sie fertig. Es ist wahrscheinlicher, dass Sie nach dem Extrahieren einer bestimmten Anzahl von Ziffern den Vorgang beenden möchten.

0

Für was es wert ist, hier ist eine Modifikation der Lösung für jede Base bis zu 64 konvertieren:

// Convert decimal into a base between 2 and 64 
var decToBase = function() { 
    var decToBaseMap = [ 
     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 
     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'Y', 'Z', 
     '+', '/']; 

    return function(number, base) { 

     if (base < 2 || base > 64) { 
      return "#base should be between 2 and 64#"; 
     } 

     var negative = ''; 
     if (number < 0) { 
      negative = '-'; 
     } 

     number = number.toString().split('.'); 
     var integer = Math.abs(number[0]); 
     var fraction = number[1]; 
     var result = ''; 

     do { 
      result = decToBaseMap[integer % base] + result; 
      integer = parseInt(integer/base, 10); 
     } while (integer > 0); 

     if (fraction) { 
      var decimalPlaces = fraction.toString().length; 
      result += '.'; 
      fraction = parseFloat('.' + fraction); 

      var x = 0; 
      do { 
       x++; 
       var res = (fraction * base).toString().split('.'); 
       result = result + decToBaseMap[res[0]]; 

       if (res[1]) { 
        fraction = parseFloat('.' + res[1]); 
       } 
       else { 
        break; 
       } 
      } while (x < decimalPlaces); 
     } 
     return negative + result; 
    }; 
}(); 

alert(decToBase(2011, 64)); // displays "VR" 

Sie mit ihm spielen hier können: http://jsfiddle.net/kaicarver/d3Zn2/

Verwandte Themen