Преобразование единиц - PullRequest
       27

Преобразование единиц

0 голосов
/ 22 февраля 2011

Я занимаюсь разработкой инструмента конвертации единиц, у меня вопрос о том, как конвертировать единицы.я нашел в интернете много скриптов, но все они повторяют функцию для всех значений единиц (день в секунду, день в минуту, день в час ......................., как этот http://dennisjaamann.com/blog/?p=44 это очень хорошо для небольшого количества единиц для экзамена 3 в темп и 4 единицы в длину ...

, но если мне нужно сделать один заранее, так что яЯ собираюсь сделать тысячи кода, который займет больше времени и меньше времени на выполнение.так что я думаю, что другой способ намного проще, используя некоторую математику.

любой может помочь мне в этом, пожалуйста ??

Пример для некоторого онлайн-конвертера JS, который мне нужен, чтобы сделать что-то похожее в AS3:

http://www.unitconverters.net/time-converter.html

Большое спасибо

Ответы [ 5 ]

3 голосов
/ 22 февраля 2011

Не могли бы вы заранее определить все единицы в общую единицу.

например,

FOOT = 0.3048 metres
YARD = 0.9144 metres
INCH = 0.0254001 metres

и т. Д.

, а затем, когда кто-то хочет перевести 7 футов в ярды.Вы делаете что-то вроде.

convertUnits(feet, yards, 7);
function convertUnits(unitFrom:String, unitTo:String, amount:Number){
//(0.3048/0.9144)*7
return (myDictionary[unitFrom]/myDictionary[unitTo]) * amount;
}

может работать?

1 голос
/ 23 февраля 2011

+ 1 @trevor и справочные таблицы

это более гибкое решение, просто остерегайтесь не смешивать килограммы и расстояния:)

особый случай - это преобразования времени, в которых вы можете использоватьвстроенный объект Date:

// how much is 3775 seconds?
var date:Date = new Date( null, null, null, null, null, 3775 );
// 1h 2min 55s
trace( date.hours, date.minutes, date.seconds )

это удобно, потому что он управляет особыми случаями, связанными с количеством дней в месяце: 28,29,30 или 31.

, которые вы все еще можете использоватьМетод Тревора для ручной установки соответствий (1H = 3600 с, 1 мин = 60 с, 1 мс = 0,001 с и т. д.), например, приведенный ниже код создает «таблицу» соответствия между расстояниями (пример @ trevor) и временем;использование расстояний прямое, но использование времени более сложно:

package  
{
import flash.display.Sprite;
public class Converter extends Sprite
{
    private var MILLIMETER:Number = .001;
    private var CENTIMETER:Number = .01;
    private var DECIMETER:Number = .1;
    private var METER:Number = 1;
    private var FOOT:Number = 0.3048;
    private var YARD:Number = 0.9144;
    private var INCH:Number = 0.0254001;

    private var MILLISECOND:Number = SECOND * 0.001;
    private var SECOND:Number = 1;
    private var MINUTE:Number = 60 * SECOND;
    private var HOUR:Number = 60 * MINUTE;
    private var DAY:Number = 24 * HOUR;
    private var MONTH:Number = 30 * DAY;
    private var YEAR:Number = 12 * MONTH;

    public function Converter() 
    {


        var seconds:Number = 10215464578;

        var date:Date = new Date( null, null, null, null, null, seconds );
        trace( date.fullYear, date.month, date.day, date.hours, date.minutes, date.seconds )

        //does the same as 
        var ye:Number = convertUnits( seconds, SECOND, YEAR, true );
        var mo:Number = convertUnits( seconds, SECOND, MONTH, true )    % ( YEAR / MONTH );
        var d:Number = convertUnits( seconds, SECOND, DAY, true )       % ( MONTH / DAY );
        var h:Number = convertUnits( seconds, SECOND, HOUR, true )      % ( DAY / HOUR );
        var mi:Number = convertUnits( seconds, SECOND, MINUTE, true )   % ( MINUTE );
        var s:Number = seconds % MINUTE;
        trace( ye, mo, d, h, mi, s );

    }

    private function convertUnits( amount:Number, unitFrom:Number, unitTo:Number, floor:Boolean = false ):Number
    {
        var val:Number = ( unitFrom / unitTo ) * amount;
        return floor ? int( val ) : val;
    }
}
}

в течение 3775 секунд это даст:

1899 11 0 1 2 55

00 0 1 2 55

и за 10215464578 секунд

2223 8 4 13 2 58

328 5 4 13 2 58

это означает, что конвертер не учитывает сам календарь, он вычисляет количество времени (месяц = ​​30 дней, что не соответствует действительности).

0 голосов
/ 11 мая 2013

В настоящее время для преобразования даты и времени, расчетов и форматирования (включая i18n) вы можете использовать MomentJs .

Для всех других преобразований я начал работать с MeasurementJs из-за необходимости в подобном решении, которое также пытается нацелить на красивый простой API, такой как MomentJs.

0 голосов
/ 22 февраля 2011

Чтобы сэкономить на коде, вам может потребоваться работать по-другому - например, при определении «формулы» для каждого типа преобразования и при запросе преобразования применять правильную формулу - для этого потребуется одна функция, которая принимает значенияи формула и вычисляет формулу в соответствии с введенными значениями и выплевывает результат.Однако это все еще требует от вас - разработчика - ввода всех формул и написания кода, чтобы найти правильную формулу для преобразования и выполнить ее.Возможно, столько же работы.

Удачи

0 голосов
/ 22 февраля 2011

Преобразование единиц будет быстрым, несмотря ни на что.Существуют заданные формулы для преобразования в любые типы единиц, поэтому просто пересоздайте их в своем коде.Мало того, что если вы сделаете все это в Javascript, то именно компьютер пользователя должен будет выполнять все вычисления в любом случае, поэтому он будет таким же быстрым, как и их компьютер.

Если бы я был вамитогда я просто начал бы конвертировать единицы измерения и продолжал идти до тех пор, пока вы не получили что-то полезное, а затем рефакторинг.

...