2017-06-21 1 views
1

Ich habe einen Wert von `1200000 mm‘ und ich wan't ein Verfahren zu haben, die zu dem besten Präfix automatisch überträgt wie:Wie zum besten Präfix mit js-Mengen konvertieren?

import Qty from 'js-quantities' 

const qty = new Qty(1200000, 'mm').toBest() 
// now set to 1.2, 'km' same as doing to('km') directly 

Ist das irgendwie möglich?

Oder wie bekomme ich die geordnete Liste von Einheiten mit Präfixen für die gegebene Einheit, um es selbst zu tun?

+1

„Best“ ist subjektiv natürlich, aber man konnte von 1000 metrischen Präfixen, Dividieren jedes Mal, Schritt für Schritt durch, bis Sie ein Format haben du gemocht. – Pickle

+0

Höchstwahrscheinlich ein rekursiver Aufruf bis "quantity/1000" <1 würde Ihnen passen, aber Sie müssten eine Objektkarte erstellen, um die Einheit zu halten –

+0

Aber wie kann ich die Liste der möglichen Präfixe für jede Einheit erhalten. Wie Meter sollte auch cm unterstützen, was manchmal am besten sein kann, Der beste ist ein kleiner Wert> 1. – Alinex

Antwort

1

Hier ein kleines Beispiel eines rekursiven Prozess mit einer Einheit Karte ist, die von 1000 teilt, bis er Optim

function toBest(num, unit) { 
 
    const map = { 
 
     "mm" : "m", 
 
     "m" : "km", 
 
     "km" : "km" 
 
    }; 
 
    let recurse = false; 
 
    let nextUnit = unit; 
 
    if ((num/1000) >= 1) { 
 
     num = (num/1000); 
 
     nextUnit = map[unit]; 
 
     recurse = true; 
 
    } 
 
    if (recurse) { 
 
     return toBest(num, nextUnit) 
 
    } else { 
 
     return num+" "+unit; 
 
    } 
 
} 
 

 
console.log(toBest(1000, "mm")); 
 
console.log(toBest(10000000, "mm")); 
 
console.log(toBest(47243278423, "m")); 
 
console.log(toBest(1000000, "mm")); 
 
console.log(toBest(999999, "mm")); 
 
console.log(toBest(2, "mm"));

Jetzt erreicht hat, auf diese zu erweitern, Sie sagen, Sie können wollen cm bis m oder vielleicht sogar km bis dm. Hier wird die Objektkarte knifflig. Sie müssen den Divisor für jede mögliche gewünschte Konvertierung explizit definieren.

const map = { 
    "mm" : { 
     "to" : "cm", 
     "divisor" : 10 
    }, 
    "km" : { 
     "to" : "dm", 
     "divisor" : .0001 
    }, 
} 

Jetzt ist Ihre Schleife bekommt mehr if/else checky, aber die rekursive Logik halten sollte.

+0

Sieht gut aus, ich werde es morgen überprüfen müssen. – Alinex

0

Ich habe eine weitere Forschung und fand eine andere Bibliothek, die besser funktioniert. Also änderte ich die S-Mengen against Convert-Units. Das funktioniert großartig, hat aber weniger unterstützte Einheiten (im Moment). Aber die Definitionsdateien sind besser strukturiert und ich kann später einige Einheiten hinzufügen.

import convert from 'convert-units' 

// to check if unit is supported 
try { 
    convert().from(unit) 
} catch { ... } 

// to convert unit 
const valueInMeter = convert(1200000).from('mm').to('m') 

// and finally the best unit 
const best = convert(1200000).from('mm').toBest() 
// best.val = 1.2 
// best.unit = 'km' 

Sehen Sie mehr über diese Bibliothek bei https://github.com/ben-ng/convert-units

Verwandte Themen