2009-03-18 36 views
8

¿Cuál es la mejor manera de convertir números decimales (base diez) a sexagesimal (base sesenta) representados como una cadena usando 0-9, A-Z y a-x como dígitos.Conversión de decimales a sexagesimal (base sesenta) en javascript

Estoy planeando codificarlo en javascript pero se agradece cualquier ayuda.

uso Ejemplo:

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

El código final he utilizado, basado en la respuesta de Paolo:

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

nombres de las funciones son bonitas, pero por desgracia el sexo - significa 6, no 60 :-( – derobert

+0

oh, entonces tendré que pensar en una alternativa. ¿Tal vez Sexage como el ciclo Sexage-nary lo usa? – Annan

+0

Me duele la cabeza por todas las matemáticas, pero creo que mi respuesta es la clave . –

Respuesta

2

Esto funciona con los datos de las pruebas proporcionadas, pero es probable que quiere ejecutar algunas pruebas más en él:

<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

Sólo se dividen repetidamente por 60 hasta que uno se queda con cero. Cada vez, tome el módulo y conviértalo en el carácter apropiado y agréguelo a su cadena de salida.

Editar: Para decimales, dicen que está buscando hasta 3 60decimal lugares:

Start con 0.98765 (base 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 

Así 0,98765 (base 10) se convierte en 0. [59] [15] [32] (base 60)

+0

¿Cómo funcionaría eso con las fracciones: 1234567.89 -> "5gu7.rO"? – Annan

+0

Debería especificar en primer lugar cuántas posiciones decimales desea que se evalúe y luego trabajar desde allí. – Chris

+0

Pruebe mi edición anterior en un trozo de papel ... – Chris

0

inicio dividiendo el número en un entero y parte fraccional.

Para la parte entera, tome el módulo para tirar del dígito menos significativo, luego divida por 60 y repita.

Para la parte fraccionaria, multiplique repetidamente por 60 y tome la parte entera para obtener los dígitos de resultado. Si alguna vez termina con cero, lo cual es poco probable, ha terminado. Es más probable que desee terminar después de extraer una cierta cantidad de dígitos.

0

Por lo que vale la pena, que aquí es una modificación de la solución para convertir a cualquier base hasta 64:

// 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" 

Puede jugar con él aquí: http://jsfiddle.net/kaicarver/d3Zn2/

Cuestiones relacionadas